如何查看MockK中assertEquals(...)断言失败的原因
问题:MockK验证时如何查看预期与实际对象的详细差异
测试代码
verify { function.send( withArg { assertEquals(expected, actual) }, withArg { assertEquals(expected, actual) }) }
当前堆栈跟踪输出
[1]: argument: ...responseCode=0003, usdAmount=12), matcher: matcher<Transaction>(), result: - [2]: argument: CHARGEBACK, matcher: matcher<Reason>(), result: + Stack trace: io.mockk.impl.InternalPlatform.captureStackTrace (InternalPlatform.kt:125) io.mockk.impl.stub.MockKStub.handleInvocation (MockKStub.kt:250) ...
已配置的MockK设置
stackTracesOnVerify=true stackTracesAlignment=left
解决方法
1. 改用eq匹配器(推荐)
直接使用MockK的eq匹配器替代withArg+assertEquals,eq会自动对比对象字段,并在不匹配时输出详细差异:
verify { function.send( eq(expectedTransaction), eq(expectedReason) ) }
参数不匹配时,MockK会打印出预期和实际对象的每个字段差异,无需额外配置。
2. 结合AssertJ断言增强差异输出
如果需要在withArg中自定义逻辑,改用AssertJ的断言方法,它会在失败时生成更详细的对象差异描述:
verify { function.send( withArg { assertThat(it).isEqualTo(expectedTransaction) }, withArg { assertThat(it).isEqualTo(expectedReason) } ) }
AssertJ的isEqualTo会遍历对象字段,输出哪些字段值不匹配、具体差异是什么,这些信息会被MockK包含在验证失败的堆栈信息中。
3. 开启MockK详细匹配配置
添加以下配置项,让MockK默认输出更详细的参数匹配差异:
mockk.detailed.matching=true
或者在代码中全局配置:
MockK.configure { detailedMatching = true }
内容的提问来源于stack exchange,提问作者ffff
相关产品推荐
相关产品推荐

