Как протестировать с Mockito множественный запрос с разными аргументами?
Есть тест. В метод прилетает список. На каждый элемент этого списка нужно вызвать метод. Как протестировать с помощью Mockito факт того что этот метод вызывается N-ое количество раз и понять что на каждой итерации прилетают именно нужные мне аргументы?
P.S. Дополню флоу.
У меня есть функция которая получает на вход N-ое количество карт и мне необходимо на каждую полученную карту сделать запись в аналитику. Собственно мне нужно проверить что метод вызывается N-ое количество раз и с нужными параметрами на каждой итерации.
verify(analytics, times(2)).write(any(), any())
Вот так я могу просто проверить множественный вызов. Но мне непонятно как проверить, что на каждом вызове нужные параметры.
Ответы (2 шт):
Если порядок не важен:
verify(analytics, atLeastOnce()).write(p11, p12);
verify(analytics, atLeastOnce()).write(p21, p22);
Если порядок важен:
InOrder inOrder = inOrder(analytics);
inOrder.verify(analytics).write(p11, p12);
inOrder.verify(analytics).write(p21, p22);
Естественно, это можно обернуть в цикл и пройтись по коллекции параметров.
Ответ @Vitalii Viretenko оказался верным, но я нашел еще одно решение.
Мы можем использовать ArgumentCaptor для того чтоб перехватить результаты вызова методов и потом проверить их валидность.
Для единичного аргумента:
argumentCaptor<String>().apply {
verify(mock, times(2)).someMethod(capture())
assertThat(allValues).containsExactlyElementsOf(exceptedResult)
}
Для пары аргументов:
argumentCaptor<String, String>().apply {
verify(mock, times(2)).someMethod(first.capture(), second.capture())
assertThat(first.allValues).containsExactlyElementsOf(exceptedResult1)
assertThat(second.allValues).containsExactlyElementsOf(exceptedResult2)
}
В целом если открыть класс com.nhaarman.mockitokotlin2.ArgumentCaptor там есть методы до 5 аргументов.