如何在Kotlin中使用构造函数参数创建Mockito模拟?

时间:2019-04-15 21:34:28

标签: kotlin mockito

我想使用doReturn(sth).when(underTest).someFunc()而不是when(underTest.someFunc()).thenReturn(sth)
(不想实际在someFunc()-https://stackoverflow.com/a/29394497/541624内部执行任何操作)

在Java中,我可以underTest = Mockito.spy(new SomeClass(someParam));

我得到:

Mockito cannot mock/spy because :
 - final class

1 个答案:

答案 0 :(得分:0)

您不能模拟/监视Kotlin类的原因是它们是最终的(默认情况下)。因此,除非您输入关键字open,否则Mockito无法模拟此类。

Mockito版本2引入了一项功能,允许您模拟/监视最终类。

该怎么做? 将mockito-inline依赖项与其他mockito v2依赖项一起添加。例如:testImplementation 'org.mockito:mockito-inline:2.8.9'

然后照常使用模拟方法。

这是一个虚拟测试,它演示了如何模拟方法而不执行任何操作。

class Foo {
    var xval = 0
    fun foo(x: Int, y: Int): Int = x / y

    fun bar(x: Int) {
        xval = x
    }
}

class FooTest {
    @Test
    fun fooTest() {
        val foo = Mockito.mock(Foo::class.java)
        Mockito.doAnswer(Answers.RETURNS_DEFAULTS).`when`(foo).foo(10, 2)

        assertEquals(0, foo.foo(10, 2))

        Mockito.doNothing().`when`(foo).bar(100)

        assertEquals(0, foo.xval)
    }
}

如您所见,您可以为返回某些内容的方法返回默认值,或者为void方法不执行任何操作。

否则,您可以使用没有此问题的mockk https://mockk.io/库。

如上所述,我建议您考虑是否可以在此处使用接口/抽象类而不是具体类。这是使用模拟抽象您的依赖关系的最佳方法。