Java 如何避免一个测试类中的模拟注入对不同类的影响?
我有我的测试类别1:Java 如何避免一个测试类中的模拟注入对不同类的影响?,java,spring,unit-testing,mocking,Java,Spring,Unit Testing,Mocking,我有我的测试类别1: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @DirtiesContext public class MyTestClass1 { @Configuration static class Config { @Bean public FileSerivce fileService() { return Mockito.moc
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@DirtiesContext
public class MyTestClass1 {
@Configuration
static class Config {
@Bean
public FileSerivce fileService() {
return Mockito.mock(FileSerivce.class);
}
}
}
另一个测试类MyTestClass2:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTestClass2 {
@Autowired
FileSerivce fileService;
}
问题是,类MyTestClass2中的文件服务是从MyTestClass1模拟自动连接的,而不是真正的文件服务。当我从MyTestClass1中删除模拟定义时,MyTestClass2根据需要使用真实的文件服务
如何删除MyTestClass2上的MyTestClass1副作用?您可以向
@ContextConfiguration
注释添加数据,例如要加载的特定配置。或者,您可以将@Qualifier
注释添加到TestClass2
中的FileService
,并强制使用具有给定名称的FileService实例
例如,如果您真正的FileService bean在MyTestClass2中被称为“fileServiceImpl”,那么您可以
@Autowired
@Qualifier("fileServiceImpl")
FileService fileService;
对于预期模拟FileSerivce的bean定义,将
名称
标识符添加到@bean
:@bean(name=“mockfileService”)
或类似内容
然后,当您只需要使用模拟版本的bean将@Qualifier注释添加到类中时:
@Autowired
@Qualifier("mockfileService")
FileService fileService;
基本上,如果要为FileService提供两种不同的实现(模拟和真实服务),则需要添加标识符,以便Spring知道使用哪种标识符
或者您可以为您的模拟使用不同的上下文配置,但这不是最佳选择。可能重复感谢您的回答@Ben Green。带有限定符的选项对我没有帮助,因为在TestClass2中,我还使用了autowire FileService的另一个服务,因此我必须将限定符也放在autowire FileService的每个服务上,但是在我的TestClass1中,用MockActualy替换真实bean要比我想象的复杂一些。我想我不明白为什么一个TestClass会影响另一个TestClass,即使我使用了DirtiesContext注释。如果有办法,我必须在MyTestClass1(使用FileService mock)之后完全清理上下文,这对我来说是至关重要的?如果将内部类设置为私有,然后在MyTestClass1中将
@ContextConfiguration
注释更改为@ContextConfiguration(classes={Config.class})