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