检查方法是否仅使用Mockito使用一次特定的论点调用



我正在使用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

相关内容

  • 没有找到相关文章

最新更新