检查Mockito方法调用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();
    }

。谢谢你的努力。

最新更新