繁体   English   中英

在Mockito中进行测试时,使用实现而不是接口是一种好习惯吗?

[英]Is it good practice to use an Implementation instead of an Interface when testing with 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
}

从有关Spy的文档(类似于@InjectMocks ):

如果可以在类型(甚至私有)中找到零参数构造函数,则由Mockito可以初始化带有@Spy注释的字段。 但是Mockito无法实例化内部类,局部类,抽象类和接口。 可以在声明点显式初始化带有@Spy注释的字段。 另外,如果您不提供实例,Mockito将尝试查找零参数构造函数(甚至是私有的)并为您创建一个实例。 但是Mockito无法实例化内部类,局部类,抽象类和接口。

因此,我知道我无法使用接口进行监视。 当我在声明/初始化Interface时使用实际的实现类时,它可以工作。

以下哪种解决方案是解决此类问题的最佳选择?

解决方案1:

    @InjectMocks
    private MyService myService = new MyServiceImpl(); // Program against Interface

解决方案2:

    @Spy
    @InjectMocks
    private MyServiceImpl myService; // Program against implementation

我的问题是,使用解决方案2并让Mockito处理实例化是一个好主意(但这意味着声明实现而不是接口),或者将解决方案1与接口一起使用并自己声明实现。

感谢大家的答复。 这对我帮助很大。 我现在结束这个问题。

基本上,我应该对实现进行测试。 我也想参考这个包含更多有用信息的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM