Kotlin 如何从mock中的外部依赖项监视类构造函数?
假设我有一个这样的测试单元:Kotlin 如何从mock中的外部依赖项监视类构造函数?,kotlin,mockk,Kotlin,Mockk,假设我有一个这样的测试单元: internal class MySerializer { fun serialize(): ByteArray { val initialBufferSize = 1000 val autoResizeBuffer = true val value = ThirdPartySerializer(initialBufferSize, autoResizeBuffer) value.doMoreS
internal class MySerializer {
fun serialize(): ByteArray {
val initialBufferSize = 1000
val autoResizeBuffer = true
val value = ThirdPartySerializer(initialBufferSize, autoResizeBuffer)
value.doMoreStuff()
return value.serialize()
}
}
如何监视来自第三方库的ThirdPartySerializer
,以确保以true
作为第二个参数调用它
我通常测试结果,而不是如何调用函数,但在这种情况下,检查构造函数调用是理想的:否则,我必须编写测试以确保输出可以大于1000字节,这是有问题的,因为“1000”常量可能会失去同步,我不想在UUT上将其公开为公共常量,以便在其测试中使用。我不知道在JVM上做这种事情的方法 但是我不明白你为什么不这么做
fun serialize(val initialBufferSize: Int = 1000): ByteArray {
val autoResizeBuffer = true
val value = ThirdPartySerializer(initialBufferSize, autoResizeBuffer)
value.doMoreStuff()
return value.serialize()
}
然后用您想要的任何初始缓冲区大小测试输出大小。这也会导致您实际测试行为,而不仅仅是假设只要您通过了这个传说中的“真实”值,一切都会正常
这还意味着,如果3d party库决定更改其外部api,或者您决定在实现中使用不同的库,那么您的测试将不需要更新。如果第二个参数的含义在库的未来版本中发生更改,您的方法甚至可能隐藏错误。重构
MySerializer
以通过ThirdPartySerializer
,然后在测试中提供模拟。您可以将ThirdPartySerializer
作为字段或函数参数,或者创建类似(int,boolean)->ThirdPartySerializer的lambda
我希望避免更改类的公共API,只是为了能够测试其行为——该类的用户不必担心/知道初始缓冲区。话虽如此,我认为您提出的方法可能是测试内部缓冲区大小的最优雅的方法。