当我构建如下结构时,我发现未通过interface
执行的类也可以被模拟。
这是如何运作的?可能与Kotlin
相关吗?
实际上,我的问题是;没有override
的类如何粉碎类的功能?我对此感到好奇。
class Sample {
fun returnFive() = 5
}
@Test
fun test(){
var sample = Sample()
sample = mockk {
every { returnFive() } returns 10
}
assertEquals(5,sample.returnFive())
}
答案 0 :(得分:1)
您的代码可以重写为
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中对此进行了更多解释。
与Kotlin有关吗?
这完全不是科特林的行为。
例如,将Java与Mockito结合使用时,您可以做同样的事情。