我有一个服务 ISOLanguageService,其方法为 getDefaultLanguage();
我想以这种方式在一个类 ISOLanguageServiceMock 中模拟此服务:
public class ISOLanguageServiceMock {
@Mock
private ISOLanguageService isoLanguageService;
public ISOLanguageServiceMock() {
MockitoAnnotations.initMocks(this);
ISOLanguage isoLanguage = new ISOLanguage();
isoLanguage.setLanguageCode("EN");
when(isoLanguageService.getDefaultLanguage()).thenReturn(isoLanguage);
}
然后我有其他服务 UserService 在其方法之一中使用此服务 isoLanguageService 。
public void doSomtthing() {
return isoLanguageService.getDefaultLanguage()
}
我想测试 UserService,但我想以某种方式重用模拟 ISOLanguageServiceMock,因为它将在许多其他服务中使用。
我想要这样的东西
@RunWith(PowerMockRunner.class)
public class UserServiceTest {
private ISOLanguageServiceMock languageMock = new ISOLanguageServiceMock();
@InjectMocks
private UserService userService;
public void setUp() {
MockitoAnnotations.init(this)
}
public void testDoSomething() {
userService.doDomething();
}
}
我希望将 isoLanguageService 的模拟注入(inject)到 userService 中,但事实并非如此...
有没有办法重用模拟?我是否必须在每个测试类中编写 isoLanguageService 的模拟??
最佳答案
您不能以这种方式重用模拟。您需要将 @Mock
实例添加到您的测试用例中,并在其中使用它们。
含义:
@Mock
private ISOLanguageService isoLanguageService;
以及 UserServiceTest
类的规范。
Mockito 不理解(或不关心)您的 ISOLanguageServiceMock 类包含可以注入(inject)到被测类中的内容。 Mockito 会查找测试类中的模拟,然后将它们注入(inject),仅此而已!
关于重用方面:
- 您可以通过子类化(拥有带有 @Mock 字段的基类)来做到这一点
- 但是,从某种程度上来说,这是一种不好的做法。单元测试应该尽可能是独立的。当单元测试重复代码时,这是可以,因为您希望能够查看一个文件(您的测试用例)来了解发生了什么。
含义:(一般来说),单元测试中的代码重复并不是那么重要。单元测试的目标是实现快速调试。
好吧,一些替代方案:
- 您当然可以不使用
@InjectMocks
。在这种情况下,您的生产代码需要另一种方式让您自己注入(inject)模拟对象(setter 或仅测试构造函数)。 - 当您手动注入(inject)时,您当然可以注入(inject)任何您想要的模拟对象,甚至是来自另一个类的模拟对象
- 但是:不需要额外的类,只需在某个地方有一个返回(预配置的)模拟的
静态
方法即可。
关于java - 是否可以重用模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51726419/