gpt4 book ai didi

java - 使用 mockito 检查是否只用特定参数调用了一次方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:15 25 4
gpt4 key购买 nike

我在 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) 中使用 times(1) 并在 (2) 中使用 times(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)
}

我不知道这是一个错误,还是预期的行为,但至少这是有效的

编辑:

好吧,我觉得自己像个白痴,因为它根本不是一个错误,它确实是预期的行为,它为我省去了一些 future 的麻烦

在使用捕获器时,我发现当调用 setItems 方法时,Mockito 保留对返回列表的引用。

下次调用它时,我曾经将项目添加到 myItems 并且 Mockito 保留了新的引用

但是由于我执行了 addAll 操作,之前保留的引用也得到了更新,所以 Mockito 在我调用它时需要 times(2) 方法确实是正常的,因为它得到的列表在第一次调用中已更新并将匹配第二个列表。

看起来正确的方法是发送该列表的副本,这样 viewModel 就无法以任何方式更改原始列表

关于java - 使用 mockito 检查是否只用特定参数调用了一次方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55966353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com