我正在使用Kotlin中的Mockito检查列表是否正确分页
我使用此代码
logic.searchItems(filter)
verify(vm).setItems(all.subList(0, 10), true)
logic.loadNext()
verify(vm).setItems(all.subList(0, 20), true) (1)
logic.loadNext()
verify(vm).setItems(all.subList(0, 30), true) (2)
从理论上讲,这应该起作用,但是我在(1(和(2(中得到了太多的调用例外。
如果我使用(1(中的时间(1(和(2(在(2(中的时间(2(。但是我想验证使用这些特定参数调用该方法。
可以使用Mockito?
在进行了一些测试之后,我发现问题是在我的逻辑中,我将结果添加到同一列表中,然后再将其发送回它们:
addItems(results:List<Item>()){
//verifications here
myItems.addAll(results)
vm.setItems(myItems,true)
}
出于某种原因使Mockito认为是相同的调用?
当我这样做时,它起作用
addItems(results:List<Item>()){
//verifications here
myItems.addAll(results)
vm.setItems(myItems.map { it.copy() },true)
}
我不知道这是一个错误还是预期的行为,但至少这有效
编辑:
好吧,我觉得自己像个白痴,因为它根本不是一个错误,它确实是预期的行为,它为我节省了一些未来的麻烦
使用绑架者时,我发现当setItems
方法称为Mockito时,请保留对返回列表的引用。
下次被称为我用来将项目添加到Myitems时,Mockito保留了新的参考
但是,由于我执行了addAll
操作,因此以前保留的引用也被更新了,因此,莫科托(Mockito将匹配第二个列表。
看起来正确的方法是发送该列表的副本,这样的方式,ViewModel无法以任何方式更改原始列表
使用这种参数,是一个包含特定内容的集合,我建议使用ArgumentCaptor
功能。多亏了这一点
final ArgumentCaptor<List> captorListOne = ArgumentCaptor.forClass(List.class);
final ArgumentCaptor<List> captorListTwo = ArgumentCaptor.forClass(List.class);
final ArgumentCaptor<List> captorListThree = ArgumentCaptor.forClass(List.class);
verify(vm).setItems(captorListOne.capture(), true)
logic.loadNext()
verify(vm).setItems(captorListTwo.capture(), true)
logic.loadNext()
verify(vm).setItems(captorListThree.capture(), true)
List listToAssert = captorListOne.getValue();
...
更多参数captor