我在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();
}
。谢谢你的努力。