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 @Autowired
String
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.
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.
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").