Mockito注释@Spy
或@InjectMocks
在接口上不起作用:
public interface MyService() {}
public class MyServiceImpl implements MyService {}
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
@Spy
@InjectMocks
private MyService myService; // won't work
@Mock
MyDao myDao;
// tests
}
来自间谍的文档(类似于@InjectMocks
):
如果零,则用 @Spy 注释的字段可以通过 Mockito 初始化 参数构造函数可以在类型中找到(甚至是私有的)。但 Mockito 无法实例化内部类、局部类、抽象 类和接口。用@Spy注释的字段可以是 在声明点显式初始化。或者,如果您 不提供 Mockito 将尝试查找零参数的实例 构造函数(甚至是私有的)并为您创建一个实例。但是莫西托 无法实例化内部类、局部类、抽象类和 接口。
所以我明白我不能使用界面来监视。当我在声明/初始化接口时使用实际的实现类时,它有效。
以下哪种解决方案最适合处理此类问题?
解决方案 1:
@InjectMocks
private MyService myService = new MyServiceImpl(); // Program against Interface
解决方案 2:
@Spy
@InjectMocks
private MyServiceImpl myService; // Program against implementation
我的问题是使用解决方案 2 并让 Mockito 处理实例化(但这意味着声明实现而不是接口)还是使用带有接口的解决方案 1 并自己声明实现。
感谢所有的回复。它对我帮助很大。我现在将关闭这个问题。
基本上我应该针对实现进行测试。我还想参考这个问题,其中包含一些更有用的信息。