kotlin 如何验证传递给Mockk模拟的参数的深度相等性?

h9vpoimq  于 2023-06-24  发布在  Kotlin
关注(0)|答案(1)|浏览(157)

看起来,Mockk mock只存储对接收到的参数的引用,以便稍后进行验证。一旦参数在整个测试过程中被修改,就会出现问题。如何验证模拟函数调用的参数是否深度相等?
下面的代码片段演示了这个问题:

data class Entity(var status: String)

interface Processor {
    fun process(entity: Entity)
}

class ProcessorTest {
    @Test
    fun `should receive untouched entity`() {
        val myEntity = Entity("untouched")

        val processorMock: Processor = mockk()
        every { processorMock.process(any()) }.answers {
            println(firstArg<Entity>().status)
        }

        processorMock.process(myEntity)  // process untouched entity
        myEntity.status = "touched"      // afterwards it becomes touched

        verify { processorMock.process(Entity("untouched")) }
    }
}

processorMock::process是,显然是用一个“untouched”实体调用的,因为它打印出“untouched”。但是,验证失败:

java.lang.AssertionError: Verification failed: call 1 of 1: Processor(#1).process(eq(Entity(status=untouched)))). Only one matching call to Processor(#1)/process(Entity) happened, but arguments are not matching:
[0]: argument: Entity(status=touched), matcher: eq(Entity(status=untouched)), result: -

我也试过使用CapturingSlot,但没有成功。
Mockk版本是1.9.3,Kotlin版本是1.3.70。我使用JUnit 5作为测试框架。
任何帮助将不胜感激!

wrrgggsh

wrrgggsh1#

我也有同样的问题!我正在使用eq(),但即使对象类相同,验证也失败了;只有对象引用不同!在莫克区很糟糕

相关问题