连续调用的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++;
}