适当使用 Mockito.reset()?

Man*_*anu 6 java unit-testing mockito

Mockito.reset()文档:

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

我有从前端调用的 servicemethod,其中包含 3 个布尔值的 DTO 作为唯一参数 - 让我们调用它们ab并且c

public void executeService(AbcDTO dto) { (...) }
Run Code Online (Sandbox Code Playgroud)

根据布尔值的值,服务随后调用aManager.a()bManager.b()cManager.c()。事实上,我可以在 3 个单独的服务方法中做到这一点,但我宁愿不这样做。

我想单元测试的booleanvalues的每一个可能的组合ab并且c,所以我写了类似:

@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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我相信我有两个选择:

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

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

aro*_*ech 6

您可能想尝试使用参数化测试zohhak 框架,以便为每个布尔值组合运行 1 次测试。在这种情况下,无需重置模拟。