我在一个用@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
bean用于设置外部文件的路径,该文件包含启动时必须读取的注册码。它用于@Component
类中:
@Component
public class MyParsingComponent {
private String CONFIG_PATH;
@Autowired
public void setCONFIG_PATH(String configPath) {
this.CONFIG_PATH = configPath;
}
}
在调试的时候,我在每个方法和测试配置类的构造函数中设置了一个断点,@TestConfiguration
的构造函数断点被命中,所以我知道我的测试配置类示例化了,但是这个类的configPath
方法从来没有被命中。相反,正常@Configuration
类的configPath
方法被命中,并且MyParsingComponent
中的@Autowired
String
始终是../production/environment/path
而不是预期的/test/environment/path
。
不知道为什么会发生这种情况。任何想法都将不胜感激。
7条答案
按热度按时间jaxagkaj1#
正如Sping Boot 参考手册的Detecting Test Configuration一节中所述,任何在顶层类中配置了
@TestConfiguration
注解的bean都不会通过组件扫描被拾取。因此,您必须显式地注册您的@TestConfiguration
类。您可以通过测试类上的
@Import(MyTestConfiguration.class)
或@ContextConfiguration(classes = MyTestConfiguration.class)
来实现这一点。另一方面,如果用
@TestConfiguration
标注的类是测试类 * 内 * 的static
嵌套类,则它将自动注册。7ivaypg92#
确保您的@Bean工厂方法的方法名称不与任何现有的bean名称匹配。我遇到了一些问题,比如 config() 或(在我的例子中)prometheusConfig(),它们与现有的bean名称冲突。Spring会静默地跳过这些工厂方法,并且只是不调用它们/不示例化bean。
如果要在测试中覆盖Bean定义,请在@Bean(“beanName”)注解中显式使用Bean名称作为字符串参数。
yqyhoc1h3#
@Import({MyTestConfiguration.class})
在测试中明确导入测试配置。@Configuration
和@TestConfiguration
中的@Bean
方法的名称必须不同。至少在Sping Boot v2.2中是不同的。spring.main.allow-bean-definition-overriding=true
,否则无法覆写Bean。sxpgvts34#
对我来说,这个代码:
3pvhb19x5#
我努力解决了一个相关的问题,即使我使用的是内部静态类,我的测试bean也没有注册。
事实证明,您仍然需要将内部静态类添加到
@ContextConfiguration
类数组中,否则@TestConfiguration中的bean不会被选中。第一个
egmofgnx6#
我最近遇到了一个类似的问题,通过用@Primary和@Bean来注解我的测试bean,我解决了这个问题。不知道为什么需要这样做,这似乎没有记录在Spring文档中。我的SpringBoot版本是2.0.3。
eivnm1vs7#
在我的例子中,这是
@RunWith(SpringRunner.class)
的问题,我不确定为什么它不工作,我正在跟踪这个-Testing in Spring Boot但是在用
@ExtendWith(SpringExtension.class)
替换它之后,内部静态@TestConfiguration
类按预期创建了bean。可能是版本不匹配-我使用的是Sping Boot 2.7.2。