![](/img/trans.png)
[英]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.