Mockito宽大()何时使用

dbf7pr2w  于 2022-11-08  发布在  其他
关注(0)|答案(4)|浏览(186)

据我所知,lenient会抑制StrictStubing抛出的异常。基于这一点,不应该使用lenient,也许只是在执行TDD时临时使用,因为严格的存根异常通常意味着您的代码是错误的,测试设计得很糟糕,或者您添加了不必要的行。
是否存在lenient对于测试实际需要或有用的实际场景?

ia2d9nvy

ia2d9nvy1#

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

f5emj3cl

f5emj3cl2#

我刚刚遇到了一个不寻常的有效用法。我们做了一个代码更改,默认情况下禁用了一个功能(在未来的版本中将其完全删除之前)。我们需要测试禁用功能是否真的有效,因此我们需要将一些标志模拟为false。然而,我们还需要模拟一些其他值,因为如果禁用该功能的代码位(测试该标志)不知何故被破坏了,该特性的默认设置将导致它无论如何都不做任何事情,因此我们无法观察到标志的故障。
总结如下:在成功的情况下,我们会得到UnnecessaryStubbingException,但如果没有它,失败的情况实际上不会失败,因此我们将这些特定的模拟标记为宽松的。

pqwbnv8z

pqwbnv8z3#

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

jq6vz3qz

jq6vz3qz4#

@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();
  }

相关问题