Рубрики
Без рубрики

Заглушение последовательных вызовов в стиле итератора Mockito

Глушение методов итератора Mockito, Глушение последовательных вызовов Mockito, глушение стиля итератора Mockito, разное возвращаемое значение Mockito при вызовах одного и того же метода

Автор оригинала: 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 Заглушают

Мы можем использовать этот подход, чтобы заглушить итератор. Давайте рассмотрим простой пример использования методов итератора с помощью последовательных вызовов.

Iterator 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++;
}