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 一起使用时,您可以做同样的事情。