簡體   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