Mockito为泛型@BeforeEach设置方法中定义的存根抛出UnnecessaryStubbingException

xzlaal3s  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(288)

我有一个单元测试类,我的测试单元依赖于另一个类。使用Mockito模拟依赖关系,然后使用JUnit的@BeforeEach注解在每个单元测试之前运行一个通用存根进行设置。参见下面的伪代码。

@ExtendWith(MockitoExtension.class)
public class FooFactoryTest {

    @Mock
    private BarDependency barDependency;

    @InjectMocks
    private FooFactory unitUnderTest;

    @BeforeEach
    public void setup() {
        when(barDependency.leftBar(any())).thenReturn(new Bar());
        when(barDependency.rightBar(any())).thenReturn(new Bar());
    }

   ... many tests ...

这个设置在我的10个单元测试中的9个都很好用。不幸的是,我的一个测试失败了,出现了以下错误:

org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at nl.devillers.mockito.FooFactoryTest.setup(FooFactoryTest.java:69)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.

现在,我明白了这个错误以及为什么抛出它,因为在那个特定的测试中,我的被测单元提前短路了,没有命中所有已经设置好的存根。我知道Mockito中有一个lenient选项,但这将禁用对 * 整个 * 类/项目的检查。
我的问题是:如何为一个特定单元测试禁用此严格性
再次重申:我不想在类或项目级别禁用严格性,因为我认为这是有价值的检查。我也不想把我的设置代码移到需要存根的测试中,因为那样我必须重复设置代码九次。在这种情况下,我只想禁用或跳过此特定测试的检查。

mw3dktmi

mw3dktmi1#

您可以通过使用未被调用的存根重置模拟来避免在测试级别进行这种检查。这是一种变通方法,但它允许您通过测试,而不必使mock对整个测试类宽松,也不必从设置方法中完全删除mock。
要重置barDependency mock,请将以下代码行添加到UnnecessaryStubbingException失败的测试的 * 末尾 *。

Mockito.reset(barDependency);

如果barDependency上的存根 * 都没有被使用,你也可以把这一行放在你的测试的开始,用你的其他安排,这是一个小干净。或者,将其放在测试方法的顶部,然后设置您需要的存根。这基本上覆盖了您的通用设置方法中正在设置的任何内容。

8nuwlpux

8nuwlpux2#

您也可以在@BeforeEach的代码中使用lenient,如下所示:

@BeforeEach
public void setup() {
    lenient().when(barDependency.leftBar(any())).thenReturn(new Bar());
    lenient().when(barDependency.rightBar(any())).thenReturn(new Bar());
}

根据UnnecessaryStubbingException中的文档,这应该是不必要的:
Mockito JUnit Runner仅在没有测试方法使用存根时触发UnnecessaryStubbingException。这意味着可以将默认存根放在“setup”方法或测试类构造函数中。其中一个测试方法至少需要使用一次该默认存根。

相关问题