[英]Java good practice - Declarations of interface types instead of declarations of implementation types
[英]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.