После некоторого тестирования я понял, что проблема в том, что в моей логике я добавил результаты в тот же список, прежде чем отправить их обратно следующим образом:
addItems(results:List<Item>()){
//verifications here
myItems.addAll(results)
vm.setItems(myItems,true)
}
это почему-то заставило мокито думать, что это был тот же самый вызов?
когда я так делаю, это работает
addItems(results:List<Item>()){
//verifications here
myItems.addAll(results)
vm.setItems(myItems.map { it.copy() },true)
}
Я не знаю, является ли это ошибкой или предполагаемым поведением, но по крайней мере это работает
редактирование:
Хорошо, я чувствую себя идиотом, потому что это совсем не ошибка, это действительно предполагаемое поведение, и это спасло меня от некоторых будущих проблем
при использовании захватчиков я выяснил, что при вызове метода setItems
Mockito сохраняет ссылку на возвращаемый список.
при следующем вызове я использовал для добавления элементов в myItems, а Mockito сохранил новую ссылку
но поскольку я выполнил операцию addAll
, ранее сохраненная ссылка также была обновлена, поэтому вполне нормально, что Mockito нуждается в методе times (2) при его вызове, потому что список, который он получил в первом вызове, был обновляется и будет соответствовать второму списку.
кажется, что правильно отправить копию этого списка, таким образом viewModel не может каким-либо образом изменить исходный список