用嘲讽嘲笑内部类

时间:2019-04-02 13:03:36

标签: android unit-testing kotlin mockito junit4

我有一个正在测试的类,标记为“内部”

internal class UnderTest{
    fun methodToTest(){}
}

在我的JUnit测试中,我想测试UnderTest     导入com.nhaarman.mockito_kotlin.mock

class SimpleTest{
    val mock = mock<UnderTest>()

    @Test
    fun test(){
        assertThat(....)
    } 
}

这里有点奇怪,因为Android Studio首先抱怨UnderTest不可见,“公共属性公开了它的私有类型”。那是因为UnderTest被标记为内部。

我将Test本身更改为内部,这导致编译器再次满意:

import com.nhaarman.mockito_kotlin.mock

internal class SimpleTest{
    val mock = mock<UnderTest>()

    @Test
    fun test(){
        assertThat(....)
    } 
}

运行此测试会导致像旧的模仿版本中一样出现模仿异常

Cannot mock/spy class com.name.UnderTest
Mockito cannot mock/spy because :
- final class

我想为那些内部类编写单元测试,但是又如何从UnderTest类中删除内部修饰符呢?

谢谢

1 个答案:

答案 0 :(得分:2)

问题不是类是internal(相当于同一模块中的public),而是它是final。默认情况下,除非您用final标记,否则Kotlin中的所有类都是open

因此,如果您要模拟您的课程,则应将其标记为internal open class Xyz。 请注意,有一个Maven / Gradle插件会自动为您打开所有类:all-open plugin

例如,给定以下Kotlin类:

internal open class Foo

以下单元测试通过:

class FooTest {
    @Test
    fun shouldPass() {
        Mockito.mock(Foo::class.java)
    }
}