web-dev-qa-db-fra.com

Spring Boot: @TestConfiguration ne remplace pas le bean pendant le test d'intégration

J'ai une Bean définie dans une classe décorée avec @Configuration:

@Configuration
public class MyBeanConfig {

    @Bean
    public String configPath() {
        return "../production/environment/path";
    }
}

J'ai une classe décorée avec @TestConfiguration qui devrait remplacer cette Bean:

@TestConfiguration
public class MyTestConfiguration {

    @Bean
    @Primary
    public String configPath() {
        return "/test/environment/path";
    }
}

Le bean configPath est utilisé pour définir le chemin d'accès à un fichier externe contenant un code d'enregistrement qui doit être lu au démarrage. Il est utilisé dans une classe @Component:

@Component
public class MyParsingComponent {

    private String CONFIG_PATH;

    @Autowired
    public void setCONFIG_PATH(String configPath) {
        this.CONFIG_PATH = configPath;
    }
}

Lors de la tentative de débogage, j'ai défini un point d'arrêt à l'intérieur de chaque méthode, ainsi que le constructeur de la classe de configuration de test. Le point d'arrêt du constructeur de @TestConfiguration est touché. Je sais donc que ma classe de configuration de test instancie, mais la méthode configPath() de cette classe n'est jamais touchée. Au lieu de cela, la méthode configPath() de la classe @Configuration normale est touchée et le @AutowiredString dans MyParsingComponent est toujours ../production/environment/path plutôt que /test/environment/path attendu.

Je ne sais pas pourquoi cela se produit. Toute pensée serait grandement appréciée.

13
The Head Rush

Comme indiqué dans la section Détection de test de test du manuel de référence de Spring Boot, tous les beans configurés dans une classe de niveau supérieur annotée avec @TestConfiguration seront non enregistrés via l'analyse de composant. Vous devez donc explicitement enregistrer votre classe @TestConfiguration.

Vous pouvez le faire via @Import(MyTestConfiguration.class) ou @ContextConfiguration(classes = MyTestConfiguration.class) dans votre classe de test.

Par contre, si votre classe annotée avec @TestConfiguration était une classe static imbriquée intra votre classe de test, elle serait automatiquement enregistrée.

18
Sam Brannen

Assurez-vous que le nom de méthode de votre méthode de fabrique @Bean ne correspond à aucun nom de bean existant. J'ai eu des problèmes avec les noms de méthodes comme config () ou (dans mon cas) prometheusConfig () qui est entré en collision avec des noms de beans existants. Spring ignore ces méthodes d'usine silencieusement et ne les appelle tout simplement pas/n'instancie pas les haricots.

Si vous souhaitez remplacer une définition de bean dans votre test, utilisez le nom de bean explicitement comme paramètre de chaîne dans votre annotation @Bean ("beanName").

0
Marcel Thimm