【问题标题】:Mockito conditional verification with factories与工厂进行 Mockito 条件验证
【发布时间】:2010-12-09 19:38:25
【问题描述】:

是否可以在 mockito 中根据 mock 是否实际用于被测单元来验证方法是否在 mock 上调用?

举个简单的例子,我为我的被测单元提供了一个模拟工厂 (FooFactory),当调用 Foo.create() 时,它返回一个模拟工厂 (Foo) 以供单元中的某些方法使用-测试中。如何验证 Foo.method() 仅在被测单元调用 Foo.create() 时才调用?

我设想代码看起来像这样:

@Before
public void init() {
  Foo mockFoo = mock(Foo.class);
  when(fooFactory.create()).thenReturn(mockFoo);
  test = new UnitUnderTest(fooFactory);
}

@Test
... may or may not create a foo ...

@After
public void cleanup() {
  if (verify(fooFactory).create()) {  // Here's the 'conditional verification'
    Foo mockFoo = fooFactory.create();
    verify(mockFoo).close();
  }
}

举一个更具体的例子,我的工厂返回一个我想确保关闭的 Reader 对象,但并非类中的每个方法都实际构造了一个 Reader。我显然可以将验证添加到我知道需要 Reader 的每个测试中,但这似乎需要大量重复工作。

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    您确定要编写此测试吗?

    我可以看到两种解决方案:

    1) 您确实想确保资源被创建和关闭,因此尝试编写一个测试,您可以在其中验证两个方法调用。

    2) 您要确保无论何时打开资源,它也会关闭。这可以作为生产代码中的断言来实现...

    如果你真的想继续你的方法,你可以捕捉到第一个 verify 抛出的异常,如果 create() 方法没有被调用。在捕获中,您只需返回。

    另外你不应该在清理中进行验证,而是在实际的测试方法中。

    【讨论】:

    • +1。您可以为这两种情况(例如 testWasInteraction、testNoInteraction)创建单独的单元测试,并且在清理方法中没有任何其他验证。底线 - 如果您想要此验证,请编写特定的单元测试。最后,如果出现错误,您会希望看到一个测试失败,而不是在使用此方法的每个测试用例中看到多个失败。
    【解决方案2】:

    老实说,听起来您的测试太复杂了。根据我对许多项目和大量单元测试的经验,处理事情的最佳方法是确保每个测试只测试一件事。您可以拥有任意数量的断言,但它应该是一种被调用的方法和一种经过测试的场景。任何 mo 和测试都变得过于复杂。此外,其他开发人员在进一步开发应用程序时很难在稍后阶段接受测试。

    所以我建议将您的测试分成多个测试,每个场景一个,然后看看您是否仍然需要这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 2011-01-20
      • 1970-01-01
      • 2021-08-16
      • 2011-09-04
      • 2017-06-17
      • 2014-03-19
      • 2011-06-24
      相关资源
      最近更新 更多