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