Mockito: InOrder.verify не запрещает промежуточные вызовы на макете - PullRequest
1 голос
/ 26 марта 2019

Я хочу проверить, что метод макета вызывается в правильном порядке, с правильными параметрами, а также с правильным количеством вызовов методов в отношении соответствующих параметров.

Предположим, я хочучтобы проверить, что 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?

1 Ответ

1 голос
/ 26 марта 2019

Вы должны вызвать метод verifyNoMoreInteractions() для смоделированного объекта, чтобы не было больше вызовов:

InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
Mockito.verifyNoMoreInteractions(listMock);

Таким образом, проверка не будет выполнена, если между ними произойдет другой вызов, поскольку он ожидает 2 вызова, а ваш пример вызывает его 3 раза. Это также обеспечивает вызов с точно заданными аргументами в точно желаемом порядке.

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