适当使用Mockito.reset()?

时间:2015-12-22 09:10:06

标签: java unit-testing mockito

来自Mockito.reset()文档:

  

Smart Mockito用户几乎不使用此功能,因为他们知道这可能是测试不佳的迹象。通常,您不需要重置模拟,只需为每个测试方法创建新的模拟。   请考虑在冗长,过度指定的测试中编写简单,小巧且集中的测试方法,而不是reset()。

我有从前端调用的servicemethod,其中DTO包含3个布尔值作为唯一参数 - 我们称之为abc

public void executeService(AbcDTO dto) { (...) }

根据布尔值的不同,该服务会调用aManager.a()bManager.b()cManager.c()。实际上,我可以在3种不同的服务方法中做到这一点,但我宁愿不这样做。

我想逐步测试布尔值abc的每个可能组合,所以我写了类似的内容:

@Test
public void testABC() {
    // Mock aManager, bManager, cManager
    for(boolean a : asSet(true, false)) {
        for(boolean b : asSet(true, false)) {
            for(boolean c : asSet(true, false)) {
                AbcDTO dto = new AbcDTO(a, b, c);

                service.executeService(dto);

                verify(aManager, times(a ? 1 : 0)).a();
                verify(bManager, times(b ? 1 : 0)).b();
                verify(cManager, times(c ? 1 : 0)).c();
                reset(aManager, bManager, cManager);
            }
        }
    }
}

我认为这是一个测试,它清楚地表明executeService对未来读者的目的,但它只用Mockito.reset()运行绿色。阅读完文档后,我不确定这是否可行。

我相信我有两个选择:

  • 使用Mockito.reset()
  • 为每个组合编写单独的单元测试(所以8个测试有大量的复制粘贴)

问题:
这是Mockito.reset()的正确,可接受的用法,还是我应该单独进行测试?

2 个答案:

答案 0 :(得分:4)

您可能想尝试使用parameterized teststhe zohhak framework,以便为每个布尔值组合进行1次测试运行。在这种情况下,不需要重置模拟。

答案 1 :(得分:0)

如果使用TestNG,则可能需要看一下DataProviders。 这是一个很好的例子:https://www.toolsqa.com/testng/testng-dataproviders/