java - 在 Spring Boot 测试中排除配置
问题描述
我在 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
beanA
中被模拟而不是真实的实例。
如何避免其他测试中的配置类被“泄露”到其他测试中?
我在 Spring Boot 1.4.1 中看到了用于集成测试的 Spring-boot 默认配置文件,而我使用的是 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 {
}
推荐阅读
- python - 是否可以引用现有数据来使用 openpyxl 创建图表?
- python - 如何将数据提供给 keras.layer Conv2D 以及如何更改输入形状?
- javascript - (节点:93364)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝
- ios - 如何使用 PDFKit 在 iOS 应用程序中更改字体大小?
- android - 如何使用流绑定
- tcp - Lwip w/ Raw Api - 效率低下问题
- php - 在 Laravel 中覆盖 VueJS 配置文件参数
- kubernetes - 我可以从 kube-proxy pod 查询 kube-apiserver 吗?
- python - 维基百科 api 似乎总是把有问题的词弄错
- c++ - 我正在尝试在一个类中使用数组实现合并排序,但我得到的只是随机值,主要是零