簡體   English   中英

檢查Mockito方法調用verify()

[英]Check Mockito method call verify()

我在jUnit4中進行了測試:

@Mock
MyWebClient myWebClientMock;

@Test
public void testOnOpen() throws Exception {
    System.out.println("OnOpen");
    Session session = null;
    MyWebClient instance = new MyWebClient();
    instance.connectToWebSocket();

    instance.OnOpen(instance.getSession());
    Mockito.verify(myWebClientMock).sendPing();
}

在代碼的最后一行,我檢查是否調用了sendPing()方法。 我很確定此方法在OnOpen()方法內部被調用:

@OnOpen
@Override
public void OnOpen(Session session) throws IOException {
    this.session = session;
    sendPing();
}

當我進行調試時,我發現它確實已被調用。 但是,為什么Mockito.verify(myWebClientMock).sendPing()沒有通過?

因為您沒有在模擬中調用sendPing ,所以您在instance引用的對象上調用了它。

您正在測試MyWebClient嗎? 還是您正在測試使用MyWebClient其他組件,因此必須模擬MyWebClient 在這種情況下,您似乎正在測試一個特定的組件,但是在模擬過程中將期望值放在了模擬對象上。 那沒有道理。

在我看來,MyWebClient是受測試的類,您也可以對其進行模擬是沒有道理的。 您應該嘲笑與MyWebClient合作的任何類。

如果要測試OnOpen方法,則應該斷言會話已正確設置,然后sendPing也已完成了應做的任何事情。 如果sendPing調用其他某個類,則可以對此進行模擬並驗證與之的交互。

    @Test
    public void testOnOpen() throws Exception {
        System.out.println("OnOpen");

        MyWebClient instance = new MyWebClient();
        instance.connectToWebSocket();

        MyWebClient spy = Mockito.spy(instance);
        spy.OnOpen(instance.getSession());
        Mockito.verify(spy).sendPing();
    }

這樣可行。 感謝您的嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM