[英]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.