检查Mockito方法调用验证()

时间:2014-06-20 21:31:50

标签: java mockito

我在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()没有通过?

3 个答案:

答案 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();
    }

有效。谢谢你的尝试。