【问题标题】:Is Expectations redundant if I have Verifications in my test?如果我的测试中有验证,期望是多余的吗?
【发布时间】:2015-07-25 11:44:59
【问题描述】:

我对期望和验证的目的和区别感到困惑。例如

@Tested FooServiceImpl fooService;
@Injectable FooDao fooDao;

@Test
public void callsFooDaoDelete() throws Exception {
    new Expectations() {{
        fooDao.delete(withEqual(1L)); times = 1;
    }};

    fooService.delete(1L);

    new Verifications() {{
        Long id;
        fooDao.delete(id = withCapture()); times = 1;
        Assert.assertEquals(1L, id);
    }};
}

首先,如果这个测试写得不好/经过深思熟虑,请告诉我。

第二,我的问题:期望部分对我来说似乎是多余的,我想不出一个没有的例子。

【问题讨论】:

  • 我更改了标题,以便在页面底部更好地反映您的问题。如果我误解了问题,请随时恢复我的更改。
  • 旧线程,我知道,但我的理解是松散而简洁的:Expectations 块处理可能发生的事情; Verifications 块处理必须发生的事情。

标签: java unit-testing testing junit jmockit


【解决方案1】:

Expectations 的目的是允许测试记录模拟方法和/或构造函数的预期结果,根据被测代码的需要。

Verifications 的目的是允许测试验证对模拟方法和/或构造函数的预期调用,正如被测代码所做的那样。

因此,通常情况下,测试不会同时记录 验证相同的期望(其中“期望”指定一组对模拟方法/构造函数的调用,这些调用预计在代码执行时发生)正在测试中)。

考虑到这一点,示例测试如下所示:

@Tested FooServiceImpl fooService;
@Injectable FooDao fooDao;

@Test
public void callsFooDaoDelete() throws Exception {
    fooService.delete(1L);

    new Verifications() {{ fooDao.delete(1L); }};
}

【讨论】:

  • 我还是不明白。在您的示例中,您可以使用 Expectations 块实现相同的目标,对吗?什么时候需要验证块?
  • 当您想根据"Arrange Act Assert""Given When Then" 样式编写测试时,您“需要”一个验证块。
  • @Rogério 我理解这个答案,但是为什么你可以在期望块中设置验证?例如:timesminTimes 等。希望在什么情况下在期望块中使用这些验证?
  • 出于我在第三段中描述的原因,即避免在测试中编写重复代码。如果测试需要记录给定的期望,并且它也碰巧想要检查固定数量的匹配调用,那么拥有一个允许干净、简短的测试而没有毫无意义的重复的 API 会更有意义。
  • 基本上,如果您想避免样板代码和简单的times-like 验证就足够了,您可以将其放在期望块中,以使测试更易于开发和阅读。这可能会令人困惑,因为您在技术上验证期望块,但就我个人而言,我可以接受这一点,因为我看到了简单性的好处。
猜你喜欢
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2020-09-11
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多