Mockk库如何模拟非接口类?

时间:2020-05-18 18:25:37

标签: kotlin mocking mockk

当我构建如下结构时,我发现未通过interface执行的类也可以被模拟。 这是如何运作的?可能与Kotlin相关吗?

实际上,我的问题是;没有override的类如何粉碎类的功能?我对此感到好奇。

class Sample {
    fun returnFive() = 5
}

@Test
fun test(){
    var sample = Sample()
    sample = mockk {
        every { returnFive() } returns 10
    }
    assertEquals(5,sample.returnFive())
}

1 个答案:

答案 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结合使用时,您可以做同样的事情。