【问题标题】:Using When vs Verify for validating method calls使用 When vs Verify 验证方法调用
【发布时间】:2019-07-22 09:00:18
【问题描述】:

这让我很困惑,让我用基本的例子来解释一下;

public void search(String name) {
        // some more
        Response response = component.findByName(name);
        // some more action with response
    }

所以当我为它写测试时;

@Test
public void search_givenName_shouldOk() {
    Example example = new Example();
    Component component= Mockito.mock(Component.class);
    String name = "test";
    when(component.findByName(eq(name))).thenReturn(mock(Response.class));

    example.search(name);
    verify(component, times(1)).findByName(eq(name));
}

所以实际上当我们使用 eq(name) 输入编写 when(...) 子句时,它不是已经验证了我们的测试用例吗?否则 findByName 将不会返回 Response 并且进一步的调用也不行。那么当我们再次使用verify(..)进行验证时,是不是一劳永逸?

【问题讨论】:

  • 又是同一个stackoverflow社区,没有理解问题,直接参考文档或重复问题。 ->“我知道这些。我认为人们准备好在不理解的情况下参考文档。我说;当你在输入时使用'eq'时,你已经验证了它是否被该输入调用。比在验证部分你说'验证我的函数是否是用这个输入来调用的,但是你已经用 'eq' 强制你的 when 查询来验证它。"

标签: java unit-testing junit


【解决方案1】:

如果您想模拟函数的行为并因此避免对其进行测试,请使用 when()

使用verify() 检查某个函数是否已作为测试函数的一部分被调用。

这是两个不同的概念。在您的情况下,when() 没有意义,因为您想测试该功能。此外,如果经过测试的函数是 Example 类的一部分,您也不希望它被嘲笑。你只嘲笑你不想测试的东西。

【讨论】:

    【解决方案2】:

    when 不验证任何内容,它只是指示模拟对象如何表现何时将被调用。

    所以你的断言

    当你在输入时使用'eq'时,你已经验证了它是否被调用 使用该输入。

    是假的。

    所以行:

    when(component.findByName(eq(name))).thenReturn(mock(Response.class));
    

    意思是“被模拟的组件,当(如果)你的方法findByName被这个特定的名字调用时,你能返回那个很好的响应吗?”

    当您模拟了所有期望的行为并调用了实际测试的方法后,您仍然需要verify 模拟对象的行为与您预期的一样。

    【讨论】:

      猜你喜欢
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多