我在 Maven 项目中有以下设置。 生产代码的配置类:
package com.example;
@Configuration
public class MyConfiguration {
@Bean
public A beanA() {
return new A();
}
...
}
然后我有一个测试,它有一个内部配置
:
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 是否有一个简单而优雅的解决方案来避免冲突的上下文配置?
最佳答案
首先,我不喜欢将一个配置类放在另一个类中的想法。我不知道那是否经常制作,我对 Spring 有点陌生。但这是我会做的:
第一个配置文件:
@Configuration
@Import(MyConfiguration.class)
public class MyTestConfiguration {
@Bean
@Primary // added to let know on @Autowired to use this one instead of the one in first MyConfiguration.class
public A beanA() {
return mock(A.class);
}
}
第二个配置文件:
@Configuration
@Import(MyConfiguration.class)
public class MyOtherTestConfiguration {
@Bean
public B beanB() {
return new B()
}
}
我不熟悉@TestConfiguration
。这就是我使用 @Configuration
的原因。
第一个测试类:
package com.example;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfiguration.class)
public class SpringConfigurationTest {
}
第二个测试类:
package com.example.sub;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyOtherTestConfiguration.class)
public class AnotherSpringConfigurationTest {
}
关于java - 排除Spring boot测试中的Configuration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50494012/