mockk的allAny()是如何使用的

k31*_*159 5 kotlin mockk

我找不到任何allAny()我能理解的文档。官方文档将其描述为“一个特殊匹配器,它使用 any() 而不是 eq() 来作为简单参数提供的匹配器”。我不明白那是什么意思。

我有一条线

every { mockObject.method(any(), any(), any(), any(), any(), any(), any(), any(), any()) } returns 0
Run Code Online (Sandbox Code Playgroud)

我以为allAny()也许可以代替重复使用any(),但当然mockObject.method(allAny())是语法错误,因为参数太少了。

那么有什么用呢allAny()

oco*_*cos 4

Mockk 是一个很棒的库,但是官方文档中的一些示例没有提供原始的模拟类。这会导致歧义。该文档没有多大帮助。

我们假设该类Car有一个方法fun accelerate(fromSpeed: Int, toSpeed: Int)。在这种情况下,使用allAny()参数将给出您提到的语法错误。

但是,如果我们的方法有oraccelerate的默认值,编译器不会抱怨。toSpeedfromSpeed

fun accelerate(fromSpeed: Int, toSpeed: Int = 100) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

让我们进行如下测试。

val car = mockk<Car>(relaxed = true)
car.accelerate(fromSpeed = 10, toSpeed = 20)
car.accelerate(fromSpeed = 30)

// will pass
verify(atLeast = 2) { car.accelerate(allAny()) }

// will not pass
verify(atLeast = 2) { car.accelerate(any()) }

confirmVerified(car)
Run Code Online (Sandbox Code Playgroud)

allAny会无缝通过,但any不会。any接受 的所有值fromSpeed,但不接受 的所有值toSpeed

Verification failed: call 1 of 1: Car(#1).accelerate(any(), eq(100))). 1 matching calls found, but needs at least 2 calls
Calls:
1) Car(#1).accelerate(10, 20)
2) Car(#1).accelerate(30, 100)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。