java - 为什么 Mockito.verify 未能通过与我放置的测试不同的测试?

标签 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() 将按预期通过。

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

关于我如何滥用 verify() 或者我需要做什么来“完成”它有什么想法吗?

最佳答案

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 被调用一次(验证的默认值)时使用任何参数

关于java - 为什么 Mockito.verify 未能通过与我放置的测试不同的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25379374/

相关文章:

java - 如何避免 Cassandra StorageService 类 InstanceAlreadyExistsException

python - 为什么 pdb 不能访问包含异常的变量?

javascript 错误和异常处理程序

java - 从 Google App 引擎备份和恢复实体

unit-testing - 如何使用Grails 2.x单元测试从i18n消息属性获取消息?

java - lucene 忽略对默认字段以外的字段的查询

python - 使用 testfixtures 在 Django 中测试日志记录时,如何使日志发射静音?

unit-testing - chicken scheme srfi-64 测试错误问题

java - Libgdx,使用 Shader 的 Alpha 文本不起作用

java - 文件下载时返回字节数组或 servlet 输出流之间有区别吗