为什么mockito不允许stub根据不同的参数输入返回不同的返回值?

q3qa4bjr  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(307)

我尝试使用mockito来模拟一个方法,该方法根据传递给它的参数返回不同的值,使用不同的值“aaa”和“bbb”

when(myServiceMock.mymethod("aaa", myEnum.ONE)).thenReturn(true);
when(myServiceMock.mymethod("bbb", myEnum.ONE)).thenReturn(false);

为什么它不让我这样做呢?我得到了一个“UnnecessaryStubbingException”,即使stubbed方法的第一个参数是不同的

ig9co6j1

ig9co6j11#

UnnecessaryStubbingException发生在当你尝试stub一个方法,但它实际上并没有在被测试的代码中使用时。这通常发生在同一个方法有多个stub时,Mockito检测到其中一些是不必要的。
在您的例子中,异常可能是由于您没有在测试代码中使用模拟的方法,所以Mockito检测到它并抛出异常。
为了避免这种情况,您需要确保您正在模拟的方法实际上在您的测试代码中使用。
例如,下一个代码将工作没有任何问题:

@Test
    public void unnecessaryStubbings() {
        final MyService myServiceMock = Mockito.mock(MyService.class);
        when(myServiceMock.mymethod("aaa", myEnum.ONE)).thenReturn(true);
        when(myServiceMock.mymethod("bbb", myEnum.ONE)).thenReturn(false);
        Assertions.assertTrue(myServiceMock.mymethod("aaa", myEnum.ONE));
        Assertions.assertFalse(myServiceMock.mymethod("bbb", myEnum.ONE));
    }

在下一种情况下,UnnecessaryStubbingException将被抛出:

@Test
    public void unnecessaryStubbings() {
        final MyService myServiceMock = Mockito.mock(MyService.class);
        when(myServiceMock.mymethod("aaa", myEnum.ONE)).thenReturn(true);
        when(myServiceMock.mymethod("bbb", myEnum.ONE)).thenReturn(false); // Unnecessary Stabbing
        Assertions.assertTrue(myServiceMock.mymethod("aaa", myEnum.ONE));
        // Assertions.assertFalse(myServiceMock.mymethod("bbb", myEnum.ONE));
    }

您还可以阅读有关该异常以及如何在该线程中处理它的更多信息。

相关问题