用 mockito 模拟内部 类

mocking internal classes with mockito

我在测试中有一个 class,标记为 "interal"

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 不可见 "public property exposes it's private type"。那是因为 UnderTest 被标记为内部。

我将测试本身更改为内部测试,结果编译器又高兴了:

import com.nhaarman.mockito_kotlin.mock

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

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

运行 此测试会导致 mockito 异常,就像在旧的 mockito 版本中一样

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

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

谢谢

问题不在于 class 是 internal(它相当于同一模块中的 public),而是它是 final。默认情况下,Kotlin 中的所有 class 都是 final 除非你用 open.

标记它们

因此,如果您想模拟您的 class,您应该将其标记为 internal open class Xyz。 请注意,有一个 Maven/Gradle 插件可以自动为您打开所有 classes:all-open plugin.

例如,给定以下 Kotlin class:

internal open class Foo

以下单元测试通过:

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