我Bean在用@Configuration装饰的类中有一个定义:
Bean
@Configuration public class MyBeanConfig { @Bean public String configPath() { return "../production/environment/path"; } }
我有一个用@TestConfiguration装饰的类,它应该覆盖此内容Bean:
@TestConfiguration public class MyTestConfiguration { @Bean @Primary public String configPath() { return "/test/environment/path"; } }
所述configPath豆用于将路径设置为包含必须在启动期间读取的注册代码的外部文件。它在@Component类中使用:
configPath
@Component public class MyParsingComponent { private String CONFIG_PATH; @Autowired public void setCONFIG_PATH(String configPath) { this.CONFIG_PATH = configPath; } }
在尝试调试时,我在每个方法以及测试配置类的构造函数中设置了一个断点。在@TestConfiguration类的构造函数断点命中,所以我知道我的测试配置类实例化,但是configPath()该类的方法不会被击中。相反,将configPath()命中普通@Configuration类的方法,并且@Autowired Stringin MyParsingComponent始终../production/environment/path是预期值,而不是期望值/test/environment/path。
@TestConfiguration
configPath()
@Autowired
String
MyParsingComponent
../production/environment/path
/test/environment/path
不知道为什么会这样。任何想法将不胜感激。
如Spring Boot参考手册的“ 检测测试配置”部分中所述,@TestConfiguration将 不会 通过组件扫描来拾取在带有注释的顶级类中配置的任何bean 。因此,您必须显式注册您的@TestConfiguration课程。
您可以通过@Import(MyTestConfiguration.class)或@ContextConfiguration(classes = MyTestConfiguration.class)在您的测试班级上做到这一点。
@Import(MyTestConfiguration.class)
@ContextConfiguration(classes = MyTestConfiguration.class)
在另一方面,如果你有注解的类@TestConfiguration是一个static嵌套类 中 的测试类,它会自动注册。
static