用 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)
}
}
我在测试中有一个 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)
}
}