繁体   English   中英

检查Mockito方法调用verify()

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM