我有一个正在测试的类,标记为“内部”
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类中删除内部修饰符呢?
谢谢
答案 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)
}
}