Автор оригинала: Pankaj Kumar.
Иногда мы хотим издеваться над разными ответами на последовательные вызовы одного и того же метода. Мы можем создать затем*
цепочку методов с когда()
, чтобы указать стиль итератора в 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"));
Обратите внимание, что как только цепочка насмешек достигнет конца, дальнейшие вызовы вернут последний издевательский ответ.
Мы также можем предоставить различные ответы в методе thenReturn()
с помощью varargs.
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 Заглушают
Мы можем использовать этот подход, чтобы заглушить итератор. Давайте рассмотрим простой пример использования методов итератора с помощью последовательных вызовов.
IteratormockIter = 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++; }