我在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()
没有通过?
答案 0 :(得分:3)
因为您没有在模拟上调用sendPing
,所以您在instance
引用的对象上调用了它。
您正在测试MyWebClient
吗?或者您正在测试使用MyWebClient
的其他组件,因此必须模拟MyWebClient
?在这种情况下,您似乎正在测试一个特定的组件,但嘲笑对模拟的期望。这没有意义。
答案 1 :(得分:0)
在我看来MyWebClient就是被测试的类,你也会嘲笑它是没有意义的。你应该嘲笑任何与MyWebClient合作的类。
如果您正在测试OnOpen方法,那么您应断言会话已正确设置,然后sendPing已完成它应该做的任何事情。如果sendPing调用了其他类,那么你可以模拟它并验证与它的交互。
答案 2 :(得分:-1)
@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();
}
有效。谢谢你的尝试。