SpringJUnit4ClassRunner 测试的配置与 SpringBootTest 冲突
Configuration of SpringJUnit4ClassRunner Test clashes with SpringBootTest
我的项目中有一堆测试都用@SpringBootTest 注释,因此加载了 SpringBoot 上下文。
现在我最近重构了一个测试,其中我想要一个更小的范围(它是关于 camunda 的进程覆盖)到 @RunWith(SpringJUnit4ClassRunner.class)。
因为这意味着不会自动加载上下文,所以我创建了一些具有静态内部 class 配置的 bean "manually"。整个测试看起来像这样:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
ExternalConfiguration.class, MyTest.InternalConfiguration.class
})
public class MyTest{
@Autowired
private SomeBean someInternalBean;
@Configuration
public static class InternalConfiguration{
@Bean
SomeBean someInternalBean() {
return mock(SomeBean .class);
}
}
//Tests
现在,当我 运行 它时,这个测试 运行 很好。但是当我 运行 任何其他测试(那些仍然用 @SpringBootTest 注释的测试)时,我在加载 ApplicationContext 时遇到问题:
The bean 'someInternalBean', defined in class path resource [.../MyTest$InternalConfiguration.class], could not be registered. A bean with that name has already been defined in file [.../SomeBean.class] and overriding is disabled.
显然在加载 ApplicationContext 时创建了一个 bean,因为 class 被 @Component 注释并且上下文加载器试图从我的内部配置创建另一个 bean。
我不能允许覆盖 bean,因为我的模拟 bean 可能会覆盖自动创建的 bean(我试过了,他们会这样做)。
我该如何避免这种情况?我希望我的 SpringJUnit4ClassRunner 测试及其内部配置不会影响我的其他 @SpringBootTest 测试。我已经尝试使用 @ConditionalOnMissingBean 使配置 bean 成为条件,但这没有用。
原来那些内部配置 类 不应该用 @Configuration 注释。删除注释使得手动 bean 生成仍然有效并且配置不再由 componentScan 获取。
我的项目中有一堆测试都用@SpringBootTest 注释,因此加载了 SpringBoot 上下文。
现在我最近重构了一个测试,其中我想要一个更小的范围(它是关于 camunda 的进程覆盖)到 @RunWith(SpringJUnit4ClassRunner.class)。 因为这意味着不会自动加载上下文,所以我创建了一些具有静态内部 class 配置的 bean "manually"。整个测试看起来像这样:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
ExternalConfiguration.class, MyTest.InternalConfiguration.class
})
public class MyTest{
@Autowired
private SomeBean someInternalBean;
@Configuration
public static class InternalConfiguration{
@Bean
SomeBean someInternalBean() {
return mock(SomeBean .class);
}
}
//Tests
现在,当我 运行 它时,这个测试 运行 很好。但是当我 运行 任何其他测试(那些仍然用 @SpringBootTest 注释的测试)时,我在加载 ApplicationContext 时遇到问题:
The bean 'someInternalBean', defined in class path resource [.../MyTest$InternalConfiguration.class], could not be registered. A bean with that name has already been defined in file [.../SomeBean.class] and overriding is disabled.
显然在加载 ApplicationContext 时创建了一个 bean,因为 class 被 @Component 注释并且上下文加载器试图从我的内部配置创建另一个 bean。
我不能允许覆盖 bean,因为我的模拟 bean 可能会覆盖自动创建的 bean(我试过了,他们会这样做)。
我该如何避免这种情况?我希望我的 SpringJUnit4ClassRunner 测试及其内部配置不会影响我的其他 @SpringBootTest 测试。我已经尝试使用 @ConditionalOnMissingBean 使配置 bean 成为条件,但这没有用。
原来那些内部配置 类 不应该用 @Configuration 注释。删除注释使得手动 bean 生成仍然有效并且配置不再由 componentScan 获取。