连续调用的Mockito迭代器样式存根
时间:2020-02-23 14:40:44 来源:igfitidea点击:
有时,我们想为同一方法的连续调用模拟不同的响应。
我们可以用when()创建then *方法链,以在Mockito中指定迭代器样式。
Mockito存根连续呼叫
让我们看一个模拟异常的简单示例,当使用相同参数调用方法时返回一个响应。
我们将使用JUnit 5断言来验证存根方法。
UpdateUtils mockUU = mock(UpdateUtils.class);
when(mockUU.update("Data"))
.thenThrow(new RuntimeException())
.thenReturn("DATA");
assertThrows(RuntimeException.class, () -> mockUU.update("Data"));
assertEquals("DATA", mockUU.update("Data"));
//further calls will return the last mocked output
assertEquals("DATA", mockUU.update("Data"));
注意,一旦模拟链到达末尾,进一步的调用将返回最后的模拟响应。
我们还可以通过varargs在thenReturn()方法中提供不同的响应。
when(mockUU.update("Emp")).thenReturn("EMP", "EMPLOYEE", "EMP1");
assertEquals("EMP", mockUU.update("Emp"));
assertEquals("EMPLOYEE", mockUU.update("Emp"));
assertEquals("EMP1", mockUU.update("Emp"));
assertEquals("EMP1", mockUU.update("Emp"));
在我们要模拟同一方法的多次执行中的不同响应的情况下,这很有用。
请注意,如果我们定义了多个使用相同参数存根的方法,那么最后一个将覆盖较早的方法。
Mockito迭代器方法存根
我们可以使用这种方法对迭代器进行存根。
让我们看一个通过连续调用对迭代器方法进行存根的简单示例。
Iterator<Integer> mockIter = mock(Iterator.class);
when(mockIter.hasNext()).thenReturn(true, true, true, false);
int[] values = new int[] {1,2,3,4};
when(mockIter.next()).thenReturn(values[0], values[1], values[2], values[3]);
int index = 0;
while(mockIter.hasNext()) {
assertTrue(values[index] == mockIter.next());
index++;
}

