为什么Mockito.verify与我放置的测试失败的测试不同?

时间:2014-08-19 08:59:01

标签: java unit-testing exception mockito verify

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

虽然我在SFDC Apex平台上拥有丰富的单元测试经验,但我在Java方面的背景却相当有限,而且我仍然围绕使用Mockito等库来解决问题。

目前,我被一个涉及使用Mockito.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()将包含验证,将按预期传递。

HOWEVER ,第一种方法testGetWindowSize()现在将以org.mockito.exceptions.misusing.UnfinishedVerificationException失败。然后继续在testMaximizeWindow()方法中指出这个Mockito.verify()。

我是如何误导verify()或我需要做什么才能“完成”的?

1 个答案:

答案 0 :(得分:3)

验证(模拟)不会自行验证某些内容。你应该说明你要用什么魔杖来验证。 例如,如果您创建类似的测试:

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());

在测试该方法的地方,使用任何参数

调用一次(默认为验证)