Comment Charger, au Printemps de Démarrage de Test, de Base Ressort de l'Application de Contexte en Ajoutant Seulement des Composants Nommés?

0

La question

D'origine

Je suis en train de charger, dans un test d'un Ressort de Démarrage (v2.3.8) application, que le nom des composants dans une base de Printemps de l'application de contexte. Plus précisément, je veux charger, dans un test, un Printemps de l'application de contexte qui configure au moins la journalisation, le chargement externe de propriétés, de validation (via Java API de Validation), et @Value-brancher mais sans MVC, Data JPA, etc. En fait, j'ai envie de tester, à travers une contrainte annoté de l'interface (par ex. @NotBlank), un @Service qui exerce seul le système de fichiers local (pas de MVC, Data JPA, ou de tout autre Ressort Test au Démarrage "tranche") et a un data-membre alimentés par des @Value.

J'ai essayé, en vain, de nombreuses annotations (et de certains de leurs attributs inhérents), en différentes combinaison-sous-ensembles: par ex. @SpringBootTest, @Configuration, @ContextConfiguration, @TestConfiguration, @TypeExcludeFilters, etc. Par exemple:

@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()));
    }
    ...
}

Dans cet exemple, l'attribut classes de @SpringBootTest les charges de la cité de la classe mais dissimule toutes les notions de base (enregistrement, validation, etc.) que je suis aussi à la recherche.

L'extrait qui suit, à partir de Craig Murs", "Printemps de Démarrage dans l'Action", semble être exactement ce que je cherche, mais son principal outil de@SpringApplicationConfiguration) est maintenant obsolète (et de son officiellement recommandé de remplacement @SpringBootTest - ne PAS se comporter de manière égale, au moins en ce qui concerne l'attribut classes):

Bien que @ContextConfiguration fait un excellent travail de charger le Printemps de l'application contexte, il ne charge pas avec le plein Printemps de Démarrage de traitement...SpringApplication charge non seulement le contexte de l'application, mais aussi permet la connexion, le chargement externe propriétés (application.propriétés ou de l'application.yml), et d'autres fonctionnalités de Printemps De démarrage. Si vous êtes à l'aide de @ContextConfiguration, vous n'obtiendrez pas ces caractéristiques. Pour obtenir ces caractéristiques retour dans vos tests d'intégration, vous pouvez échanger @ContextConfiguration pour le Printemps Botte @SpringApplicationConfiguration:

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

Là, il obtient le "plein Printemps de Démarrage de traitement", mais en ajoutant seulement la classe (@Service) il cite (pas tous @Component, @Controlleret @Repository de son domaine).

Comment faire aujourd'hui, sans obsolète @SpringApplicationConfiguration?

Mise à jour

J'ai d'abord affirmé que mon (pas de Craig Murs") exemple (à savoir @SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE), bien que chargés de la cité de la classe, obscurci tous les principes de base d'une application de contexte que le Printemps Boot normalement la charge. Grâce à la poursuite de l'expérimentation, j'ai trouvé que cette déclaration était inexacte, dans que pas tous , mais, seulement, certains principes de base sont obscurcis, à savoir la validation (mise en œuvre de Java API de Validation). En d'autres termes, l'exploitation forestière, le chargement d'une des propriétés externes, et @Valeur de brancher sont, en effet, chargé/configuré. Je pense qu'il faut que j'ai eu de la confusion, dans l'ensemble de mon nombre de permutations/tentatives.

1

La meilleure réponse

0

Après avoir encore plus d'expériences, j'ai trouvé une réponse. Je ne peux pas dire si c'est la meilleure réponse, mais c'est concis et certainement fait le tour...

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

Dans d'autres langues

Cette page est dans d'autres langues

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