Mockk 库如何模拟非接口 class?
How does the Mockk library mock a non-interface class?
当我构建如下所示的结构时,我看到不通过 interface
执行的 classes 也可以被模拟。
这是如何运作的?会不会跟Kotlin
有关?
其实我这里的问题是;它如何在没有 override
的情况下粉碎 class 的功能?我很好奇这件事的背景
class Sample {
fun returnFive() = 5
}
@Test
fun test(){
var sample = Sample()
sample = mockk {
every { returnFive() } returns 10
}
assertEquals(5,sample.returnFive())
}
你的代码可以重写为
class Sample {
fun returnFive() = 5
}
@Test
fun test() {
val sample: Sample = mockk()
every { sample.returnFive() } returns 10
assertEquals(10, sample.returnFive())
}
这让我们看到 sample
成为 Sample
的一个实例,但 Mockk
正在创建它,而不是你。
当您将此创建委托给 Mockk
时,它会发挥一些魔力 将该实例 替换为可定义额外行为的检测实例。如果您有兴趣,Mockk 的作者在 this blog post 中对此做了更多解释。
Could it be related to Kotlin?
这不完全是 Kotlin 的行为。
例如,将 Java 与 Mockito 一起使用时,您可以做同样的事情。
当我构建如下所示的结构时,我看到不通过 interface
执行的 classes 也可以被模拟。
这是如何运作的?会不会跟Kotlin
有关?
其实我这里的问题是;它如何在没有 override
的情况下粉碎 class 的功能?我很好奇这件事的背景
class Sample {
fun returnFive() = 5
}
@Test
fun test(){
var sample = Sample()
sample = mockk {
every { returnFive() } returns 10
}
assertEquals(5,sample.returnFive())
}
你的代码可以重写为
class Sample {
fun returnFive() = 5
}
@Test
fun test() {
val sample: Sample = mockk()
every { sample.returnFive() } returns 10
assertEquals(10, sample.returnFive())
}
这让我们看到 sample
成为 Sample
的一个实例,但 Mockk
正在创建它,而不是你。
当您将此创建委托给 Mockk
时,它会发挥一些魔力 将该实例 替换为可定义额外行为的检测实例。如果您有兴趣,Mockk 的作者在 this blog post 中对此做了更多解释。
Could it be related to Kotlin?
这不完全是 Kotlin 的行为。
例如,将 Java 与 Mockito 一起使用时,您可以做同样的事情。