Mockito lenient() 何时使用

hta*_*oya 20 android unit-testing mockito android-junit

据我了解,沉默StrictStubbinglenient引发的异常。基于此,不应该使用,也许只是在执行 TDD 时暂时使用,因为严格的存根异常通常意味着您的代码要么是错误的,测试设计得很糟糕,要么您添加了不必要的行。lenient

lenient是否存在实际需要或对测试有用的实际场景?

小智 15

何时使用的一个很好的例子lenient@BeforeEach块中。

如果您在几乎所有测试用例中都使用存根,那么在每个测试用例之前创建存根是有意义的。如果您有任何不使用存根的测试,则需要使用它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();
  } 
Run Code Online (Sandbox Code Playgroud)


ams*_*ger 10

例如,如果您需要在短时间内完成从 Mockito 1 迁移到 Mockito 2(后者引入了严格存根),那么它非常有用。

  • 2016 年并不老,哈哈。例如,有大量的企业应用程序仍然使用 Java 7 左右,特别是在银行业,更不用说特定的库了。此外,很多人更喜欢仅使用“spring-boot-dependency”BOM 全面迁移他们的 Spring Boot 项目,其中第一个版本(于 2019 年 8 月发布)包含 Mockito 1。并且不要忘记总是存在的官僚主义减慢任何升级计划。欢迎广大企业前来) (9认同)

小智 7

引入严格存根是为了检测不必要的存根并编写更干净的测试。如果遇到异常,重点应该放在改进测试用例上,而不是绕过严格的存根检查。

  • @DavidGalvisSandoval 与在一个地方使用 `lenient()` 相比,在 9 个(或更多)测试中放置相同的 `when` 真的会更干净吗?特别是这个“when”可能是更大的“when”块的一部分,在这种情况下,提取其中一个来测试方法将使整个测试类的可读性降低。我认为这应该是个人或团队的判断。每个案例都是不同的,所以你不能简单地说“你不应该”,而是:“考虑一下,但在需要时可以随意打破这个规则”。盲目遵守“规则”与根本不遵守一样糟糕。保持平衡。 (16认同)
  • 如果您有 10 个测试方法,其中 9 个使用 @BeforeEach 块中初始化的存根,该怎么办?您在第 10 个测试用例中遇到存根异常。不能用宽容来“解决”这个问题吗? (5认同)

Hug*_*ghG 5

我刚刚遇到了一个不寻常的有效用途。我们对代码进行了更改,默认禁用了某个功能(在将来的版本中将其完全删除之前)。我们需要测试禁用是否确实有效,因此我们需要将某些标志模拟为 false。然而,我们还需要模拟一些其他值,因为如果禁用该功能的代码(测试该标志)以某种方式被破坏,该功能的默认设置将导致它什么都不做,所以我们不会'无法观察到标志的故障。

总结一下:在成功的情况下,我们会通过模拟得到 UnnecessaryStubbingException,但是如果没有它,失败的情况实际上不会失败。因此,我们将这些特定的嘲笑标记为宽松。


Sam*_*oul 5

如果您正在编写参数化测试,则 lenient() 也很有用。参数化测试比严格存根更能减少冗余代码。因此,如果您使用参数化测试(例如,测试所有异常条件),如果某些调用需要存根而其他调用不需要,您可能需要 lenient() 存根。首先,让你的存根尽可能具体。