【发布时间】:2018-11-02 18:37:49
【问题描述】:
我在一个 Maven 项目中有以下设置。 生产代码的配置类:
package com.example;
@Configuration
public class MyConfiguration {
@Bean
public A beanA() {
return new A();
}
...
}
然后我有一个测试,它有一个内部Configuration:
package com.example;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, SpringConfigurationTest.MyTestConfiguration.class})
public class SpringConfigurationTest {
@TestConfiguration
static class MyTestConfiguration {
@Bean
@Primary
public A beanA() {
return mock(A.class);
}
}
}
这个类中的测试工作正常。然后我在子包中有另一个测试类:
package com.example.sub;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, AnotherSpringConfigurationTest.MyTestConfiguration.class})
public class AnotherSpringConfigurationTest {
@TestConfiguration
static class MyTestConfiguration {
@Bean
public B beanB() {
return new B()
}
}
}
在此类中运行测试时,还包括来自SpringConfigurationTest.MyTestConfiguration 的测试配置。我猜这是因为包含了位于根目录中的MyConfiguration。效果是在AnotherSpringConfigurationTest 中,bean A 被模拟而不是真实实例。
如何避免其他测试中的配置类被“泄露”到其他测试中?
我看到Spring-boot default profile for integration tests 在 Spring Boot 1.4.1 中使用 Spring 配置文件,而我使用的是 Spring Boot 2.0.1。虽然我确信它可以做到。
我能想到的另一种方法是使用组件扫描来获取上下文并排除所有我不想要的,但这有点麻烦,因为我更喜欢一种我定义我想要的方法使用而不是不应该使用的东西。
Spring Boot 2 是否有一个简单而优雅的解决方案来避免上下文配置冲突?
【问题讨论】:
-
什么告诉你
SpringConfigurationTest.MyTestConfiguration也包括在内?有什么错误吗? -
日志输出表明 bean
A被基于SpringConfigurationTest.MyTestConfiguration覆盖,在调试时我可以看到它是模拟而不是真实的。 -
如何在测试中检索 Bean?与
@Autowired?现在,我看到 2 个 BeansA,你应该有一个NoUniqueBeanDefinitionException。那你怎么办? -
这个例子可能过于简单化了,所以在这些情况下,我会按照你的回答中的建议添加@Primary。但是在
AnotherSpringConfigurationTest中,我希望只有一个bean 定义存在并且来自MyConfiguration
标签: java spring-boot testing