我希望为id>=null的所有调用提供一个null值,并为所有其他调用提供一个带有捕获的id的具体Product实例:

    every { repoMock.findById(more(100, true)) } returns null
    every { repoMock.findById(capture(idSlot)) } answers { Product(idSlot.captured, "Sample Product", 1.99) }

但是,第一种行为被忽略--对于id 1234,mock返回一个Product实例.

我知道我可以通过answers{..}个街区和if个街区来解决它--但这是怎么回事?捕获行为是否排除了所有其他行为?

推荐答案

这不是特定的捕获行为,而仅仅是第二个every中的表达式与第一个every中的相同(甚至更多)的情况匹配的事实.

当您为模拟对象和参数的组合定义某些行为时,您将覆盖先前为相同的模拟对象和参数定义的任何行为.因为capture(idSlot)匹配任何参数,所以它也匹配参数>= 100,因此,它覆盖了上面一行中定义的行为.

但是,另一方面,由于第一个every确实比第二个every更具体,所以可以通过交换行来实现所需的行为:

every { repoMock.findById(capture(idSlot)) } answers { Product(idSlot.captured, "Sample Product", 1.99) }
every { repoMock.findById(more(100, true)) } returns null

然后,第二个every只覆盖repoMock和ID的所有组合的一部分的行为,也就是只覆盖>= 100的那些.

Kotlin相关问答推荐

我可以在kotlin/java.util.scanner中跳过分隔符而不重复吗?

Kotlin 复制列表中的项目以创建具有相同数据的不同对象的新列表

Kotlin .如何用从 1 到 90 的 5 个唯一数字填充列表中的每一行?

使用 Jetpack Compose 使用参数导航

如何使用 Mockk 模拟返回值类的 Kotlin 函数类型?

Kotlin 数据类中的大量参数

我可以在 Kotlin 中使用接口类型作为构造函数参数吗

Kotlin:泛型、反射以及类型 T 和 T:Any 之间的区别

将 Kotlin 类属性设置器作为函数引用

模拟异常 - 没有找到答案

Kotlin 中 lambda 表达式中的默认参数

Kotlin惰性默认属性

什么是开放式property?为什么我不能将其设置器设为private私有?

ObjectAnimator.ofFloat 不能直接在kotlin中取Int作为参数

Kotlin:如何修改成对的值?

在kotlin中初始化类变量的正确位置是什么

Kotlin 警告:Conditional branch result of type ... is implicity cast of Any?

如果kotlin已经有了getter和setter,为什么在数据类中有componentN函数?

为什么 Kotlin 会收到这样的 UndeclaredThrowableException 而不是 ParseException?

使用 Kotlin 按字母对数组进行排序