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



我试图使用mockito来模拟一个方法,该方法根据传递给它的参数返回不同的值,使用不同的值"aaa"one_answers"bbb">

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

为什么它不让我这么做?我得到一个"不必要的存根异常"。即使存根方法的第一个参数是不同的

当您尝试存根方法时,会发生UnnecessaryStubbingException,但在测试的代码中实际上没有使用它。这通常发生在同一方法有多个存根时,并且Mockito检测到其中一些是不必要的。

在您的例子中,异常可能是由于您没有在测试代码中使用mock方法引起的,因此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));
}

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

最新更新