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,只是为了能够测试其行为——该类的用户不必担心/知道初始缓冲区。话虽如此,我认为您提出的方法可能是测试内部缓冲区大小的最优雅的方法。