Я хочу проверить, что метод макета вызывается в правильном порядке, с правильными параметрами, а также с правильным количеством вызовов методов в отношении соответствующих параметров.
Предположим, я хочучтобы проверить, что List.add
вызывается следующим образом:
List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("C");
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();
Этот тест работает нормально, но он недостаточно строг для моих намерений.Проблема в том, что если фактический вызов изменится, тест не обязательно провалится.Если вы делаете что-то подобное, например:
List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("B");
listMock.add("C");
// this won't fail
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();
Я хочу убедиться, что add
сначала вызывается с "A", а затем add
вызывается с "C".В то же время add
вообще не следует вызывать ни с чем.
Единственное решение, которое я придумал, - это сочетание Mockito.verify и InOrder.verify:
// this works but doesn't seem very elegant
Mockito.verify(listMock, times(2)).add(Mockito.anyString());
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();
Теперь моя логика тестирования распространяется на Mockito.verify и InOrder.verify.
Есть ли более элегантное решение, которое запрещает промежуточные вызовы на add
?