【问题标题】:Why is Mockito.verify failing a different test than the one I placed it in?为什么 Mockito.verify 未通过与我放置的测试不同的测试?
【发布时间】:2014-10-12 07:33:35
【问题描述】:

目前正在为我雇主的一个内部 Java 项目开发单元测试。

虽然我在 SFDC Apex 平台上拥有丰富的单元测试经验,但我在 Java 方面的背景相当有限,而且我仍然在思考如何使用 Mockito 等库。

目前,我被一个涉及使用 Mockito.verify 的非常奇怪的测试失败所困扰。这很奇怪,因为 verify 似乎按预期工作,但包含它会导致不同的测试失败。

更具体地说,我有这两种测试方法:

    /**
 * Test of getWindowSize method, of class DefaultWindowHandler.
 */
@Test
public void testGetWindowSize() {
    System.out.println("getWindowSize");
    // GIVEN
    final WebDriver mockWebDriver = mock(WebDriver.class);
    final DefaultWindowHandler defaultWindowHandlerUnderTestInstance = new DefaultWindowHandler(mockWebDriver);
    Options mockOptions = mock(Options.class);
    Window mockWindow = mock(Window.class);
    Dimension dummyDimension = new Dimension(1, 2);

    // WHEN
    when(mockWebDriver.manage()).thenReturn(mockOptions);
    when(mockOptions.window()).thenReturn(mockWindow);
    when(mockWindow.getSize()).thenReturn(dummyDimension);

    final Dimension result = defaultWindowHandlerUnderTestInstance.getWindowSize();
    // THEN
    assertEquals(dummyDimension, result);
}

/**
 * Test of maximizeWindow method, of class DefaultWindowHandler.
 */
@Test
public void testMaximizeWindow() {
    System.out.println("maximizeWindow");
    // GIVEN
    final WebDriver mockWebDriver = mock(WebDriver.class);
    final DefaultWindowHandler defaultWindowHandlerUnderTestInstance = new DefaultWindowHandler(mockWebDriver);
    Options mockOptions = mock(Options.class);
    Window mockWindow = mock(Window.class);

    // WHEN
    when(mockWebDriver.manage()).thenReturn(mockOptions);
    when(mockOptions.window()).thenReturn(mockWindow);

    defaultWindowHandlerUnderTestInstance.maximizeWindow();

    // THEN
    // FIXME: If this is not commented out, a testGetWindowSize will fail!
    //Mockito.verify(mockWindow);
}

按照目前的代码,注释掉"Mockito.verify(mockWindow);",两个测试都将通过。

如果我删除// 注释标记并允许进行验证,则包含验证的第二种方法testMaximizeWindow() 将按预期通过。

但是,第一种方法 testGetWindowSize() 现在将失败并返回 org.mockito.exceptions.misusing.UnfinishedVerificationException。然后继续在 testMaximizeWindow() 方法中指明这个 Mockito.verify()。

任何想法我如何滥用verify() 或我需要做些什么来“完成”它?

【问题讨论】:

    标签: java unit-testing exception mockito verify


    【解决方案1】:

    Verify(mock) 不会自行验证某事。您应该说出您想要验证的确切内容。 例如,如果您创建如下测试:

    List mock = mock(ArrayList.class);
    verify(mock);
    

    你会得到异常:

    org.mockito.exceptions.misusing.UnfinishedVerificationException: 
    Missing method call for verify(mock) here:
    -> at StackOverflowTest.testMockito(StackOverflowTest.java:72)
    Example of correct verification:
    verify(mock).doSomething()
    

    正确测试示例:

    List mock = mock(ArrayList.class);
    mock.add(new Object());
    verify(mock).add(any());
    

    在您测试的地方,add 方法被调用了一次(默认为 verify),带有任何参数

    【讨论】:

    • 干杯!是的,那应该是 Mockito.verify(mockWindow).maximize(); ...但我不知何故失去了最大化(),然后因为失败出现在不同的测试中而感到困惑。 (我仍然不明白为什么失败会出现在不同的测试中。)
    • 我不确定我是否理解。您已经说过“在 testMaximizeWindow() 方法中指示此 Mockito.verify() ”并且您已注释行 //Mockito.verify(mockWindow);在这个方法中。因此,Mockito 在正确的测试中显示错误。
    • 如果/当注释行不再被注释掉时,testMaximizeWindow() 方法仍然会通过。这是另一种方法,它不包含 verify() 会从通过变为失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多