Come Caricare, nella Primavera del Test di Avvio, di Base a Molla Contesto di Applicazione, Aggiungendo Solo Nominato i Componenti?

0

Domanda

Originale

Sto cercando di caricare, in una prova di una Molla di Avvio (v2.3.8) applicazione, il nome dei componenti in base a Molla contesto di applicazione. Più in particolare, voglio caricare, in una prova, una Molla contesto di applicazione che consente di configurare almeno registrazione di carico esterna di proprietà, di convalida (tramite Java API di Convalida), e @Value-collegare ma senza MVC, Dati APP, etc. In sostanza, vorrei provare, attraverso un vincolo con annotazioni interfaccia (ad es. @NotBlank), un @Service che esercizi solo il file system locale (non MVC, Dati APP, o qualsiasi altra Molla il Test di Avvio "sezione") e di dati)-membro popolato attraverso @Value.

Ho cercato, inutilmente, di molte annotazioni (e alcuni di loro intrinseca attributi), in diverse combinazioni-sottoinsiemi: ad es. @SpringBootTest, @Configuration, @ContextConfiguration, @TestConfiguration, @TypeExcludeFilters, etc. Per esempio:

@Validated
public interface SomeService {
    String someMethod (@NotBlank String someParam);
}
...
@Service
public class SomeServiceImpl implements SomeService {

    @Value("${some.value}")
    private String someValue;

    @Override
    public String someMethod(String someParam) {
        // do something with local file-system,
        // with someValue in hand, and
        // knowing someParam not blank
    }
}
...
@SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)
class SomeServiceTests {

    @Autowired
    private SomeService someService;

    @Test
    void throwConstraintViolationException_whenSomeParamNil() {
        assertThrows(
            ConstraintViolationException.class,
            ()->someService.someMethod(new String()));
    }
    ...
}

In questo esempio, l'attributo classes di @SpringBootTest carica il citato classe, ma nasconde tutte le nozioni di base (registrazione, validazione, etc.) che anche io sto cercando.

Il seguente estratto, da Craig Muri' "Primavera di Avvio dell'Azione", sembra essere esattamente quello che sto cercando, ma il suo principale strumento (@SpringApplicationConfiguration) è sconsigliato (e la sua ufficialmente-sostituzione consigliato - @SpringBootTest - NON si comporta altrettanto, almeno per quanto riguarda l'attributo classes):

Sebbene @ContextConfiguration fa un grande lavoro di caricando la Molla applicazione contesto, non carica con la piena Primavera Avvio di trattamento...SpringApplication non solo carica il contesto di applicazione, ma che consente anche la registrazione, il caricamento di esterni proprietà (applicazione.proprietà o dell'applicazione.yml), e altre caratteristiche di Primavera Di avvio. Se stai usando @ContextConfiguration, non avere quelle caratteristiche. Per ottenere quelle caratteristiche di nuovo nel test di integrazione, è possibile scambiare @ContextConfiguration per la Primavera Boot @SpringApplicationConfiguration:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=AddressBookConfiguration.class)
public class AddressServiceTests {
...
}

Lì, egli ottiene la "piena Primavera Avvio di trattamento", ma aggiungendo solo la classe (@Service) egli cita (non tutti @Component, @Controllere @Repository del suo dominio).

Come fare questo oggi, senza deprecato @SpringApplicationConfiguration?

Aggiornamento

Originariamente ho dichiarato che il mio (non Craig Mura') esempio (vale a dire @SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE), anche se è caricato il citato classe, oscurato tutte le basi di un contesto di applicazione che la Primavera di Avvio normalmente il carico. Attraverso ulteriori ricerche, ho scoperto che la dichiarazione è stata imprecisa, nel senso che non tutte ma solo alcune delle nozioni di base sono oscurati, vale a dire, la convalida di implementazione di Java API di Convalida). In altre parole, la registrazione, il caricamento di proprietà esterne, e @Valore di collegare sono, infatti, carico/configurato. Penso che devo aver ottenuto confuso, in tutto il mio numero di permutazioni/tentativi.

1

Migliore risposta

0

Dopo ancora di più la sperimentazione, ho trovato una risposta. Io non so dire se è la migliore risposta, ma è conciso e non certo il trucco...

import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

// automatically configures validation (implementation of Java Validation API)
@ImportAutoConfiguration(ValidationAutoConfiguration.class)

// obscures/disables any otherwise-automatic web-environment;
// automatically configures logging, loading of external properties, and @Value-plugging;
// and, beyond that, adds to application-context only _cited_ classes/configuration-classes
@SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)// full context loaded, if unqualified

public class SomeServiceTests {
...
}
2021-11-25 08:32:45

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................