Mockito lenient() 什么时候使用?

18
据我理解,lenient可以静默StrictStubbing抛出的异常。基于此,lenient不应该被使用,或者只是在进行TDD时临时使用,因为严格存根异常通常意味着您的代码有误、测试设计不良或者添加了不必要的代码。
是否存在实际场景需要测试中使用lenient呢?
5个回答

13

@BeforeEach 块中使用lenient 的好例子就是在几乎所有的测试用例中使用存根。

如果你在几乎所有的测试用例中使用存根,那么在每个测试用例之前创建存根是有意义的。但是如果你有任何一个测试用例没有使用该存根,你将需要使用lenient 来防止严格模拟引发错误。这是在 mockito 文档中使用的示例:

  @Before public void before() {
      when(foo.foo()).thenReturn("ok");

      // it is better to configure the stubbing to be lenient:
      // lenient().when(foo.foo()).thenReturn("ok");

      // or the entire mock to be lenient:
      // foo = mock(Foo.class, withSettings().lenient());
  }

  @Test public void test1() {
      foo.foo();
  }

  @Test public void test2() {
      foo.foo();
  }

  @Test public void test3() {
      bar.bar();
  } 

10

例如,在短时间内从Mockito 1迁移到Mockito 2(后者引入了严格的存根)时,它非常有用。


Mockito 1太老了!(2016年) - htafoya
9
2016年并不算久远哈哈。例如,在银行业中仍有大量企业应用程序仍在使用Java 7或更早版本,尤其是特定库。此外,许多人更喜欢仅使用“spring-boot-dependencies” BOM全面迁移其Spring Boot项目,其中第一个版本(发布于2019年8月)包含Mockito 1。还要记得官僚主义总是会拖延任何升级计划的步伐。欢迎来到企业界;) - amseager
1
根据问题标签,您更关注Android开发 - 当然,升级这些类型的应用程序更容易(移动应用程序通常较小)。但即使在这种情况下,请记住,我记得Java 8的支持仅在2017年添加。 - amseager

7

引入了Strict Stubbing来检测不必要的存根并编写更清洁的测试。 如果您遇到异常,请专注于改进测试用例,而不是绕过严格的存根检查。


5
如果你有10个测试方法,其中9个使用@BeforeEach块中初始化的存根。在第10个测试用例上会出现存根异常。不能使用宽容模式来“修复”这个问题吗? - David
1
你不应该在@BeforeEach中打桩,试着在需要打桩的每个测试中这样做。 - David Galvis Sandoval
16
在进行9个或更多测试时,将相同的 when 放在每个测试中,是否真的比在一个地方使用 lenient() 更为清晰?特别是这个 when 可能是较大的 when 块的一部分,在这种情况下,将其中一个提取到测试方法中将使整个测试类不太易读。我认为这应该是个人或团队判断。每种情况都不同,因此不能简单地说“你不应该”,而应该是:“考虑一下,并随意打破这个规则”。盲目遵循“规则”与根本不遵循它们一样糟糕。保持平衡。 - itachi

5
我刚刚发现了一个不寻常的有效用途。我们进行了一次代码更改,将一个功能默认禁用(在未来的版本中彻底删除之前)。我们需要一个测试来确保禁用功能实际起作用,因此我们需要模拟一些标志为假。然而,由于如果用于禁用该功能的代码块(测试该标志)出现问题,该功能的默认设置会使其无论如何都不起作用,因此我们还需要模拟一些其他值,否则我们将无法观察到标志失败。
总结一下:在成功的情况下,我们使用模拟时会得到UnnecessaryStubbingException,但如果没有它,失败案例实际上不会失败。因此,我们将这些特定的模拟标记为宽容。

5

如果你正在编写参数化测试,lenient()也可能会很有用。与严格的存根相比,参数化测试可以减少重复的代码量。因此,如果你正在使用参数化测试(例如测试所有异常情况),并且某些调用需要存根而其他调用不需要,则可能需要使用lenient()存根。不过,首先尽可能使你的存根尽可能具体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接