Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免一个测试类中的模拟注入对不同类的影响?_Java_Spring_Unit Testing_Mocking - Fatal编程技术网

Java 如何避免一个测试类中的模拟注入对不同类的影响?

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

我有我的测试类别1:

@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})