在使用 Mockito 进行测试时,使用实现而不是接口是否是一种好的做法



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 并自己声明实现。

感谢所有的回复。它对我帮助很大。我现在将关闭这个问题。

基本上我应该针对实现进行测试。我还想参考这个问题,其中包含一些更有用的信息。

相关内容

  • 没有找到相关文章

最新更新