我们可能知道,默认情况下,Kotlin类一旦定义,它就是最终类,除非它被明确声明为open
。
当我们想用Mockito模拟它时,这将是一个挑战。我们需要明确地将其声明为open
。有没有一种方法可以避免将其声明为open
,同时可以对其进行模拟测试?
MockMaker插件在运行espresso测试时似乎不起作用。因此,您可以使用Kotlin的全开放pugin。
在build.gradle:中添加插件
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
apply plugin: "kotlin-allopen"
指定将使类打开的注释:
allOpen {
annotation("com.my.MyMockable")
}
创建可用于注释类的注释:
@Target(AnnotationTarget.CLASS)
annotation class MyMockable
然后,为了使您的类及其公共方法成为Mockable(开放),请使用注释对其进行注释:
@MyMockable
Mockito2现在也可以模拟最终类。
但是,此功能是选择加入,因此您需要手动启用它
为此,您需要定义一个包含mock-maker-inline
行的文件/mockito-extensions/org.mockito.plugins.MockMaker
参见例如
http://hadihariri.com/2016/10/04/Mocking-Kotlin-With-Mockito/或https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2#不可锁定
快速介绍
顺便说一句,这目前不适用于android
我知道有三种方法可以模拟Kotlin类:
-
使用接口而不是类。在这种情况下,您可以用相应的接口替换特定类的所有用法。在测试代码时,您可以模拟接口。
interface Something { /* ... */ } class SomethingImpl : Something { /* ... */ } fun processSomething(something: Something) { /* ... */ } val something = mock(Something::class.java) processSomething(mock)
-
开课,这不是很方便。
-
使用PowerMock而不是Mockito。使用它的
ClassLoader
,你可以做比Mockito多得多的事情。
我更喜欢第一种方法,因为即使不使用模拟框架,使用接口而不是类也是一个好主意。