没有开放课程,可以和Kotlin一起使用Mockito吗?
正如我们可能知道的那样,默认情况下Kotlin类曾经定义过,除非明确声明为open
,否则它是最终的。
当我们想用Mockito来模拟它时,这将会带来挑战。 我们需要明确宣布它是open
。 有没有办法我们可以避免宣布它是open
而能够为我们的测试模拟它?
Mockito2现在可以模拟最后的课程。
但是,此功能是选择性的 ,所以您需要手动启用它。
为此,您需要定义一个文件/mockito-extensions/org.mockito.plugins.MockMaker
其中包含行mock-maker-inline
在旁边注意,这目前不适用于Android
有三种方式我知道如何嘲笑Kotlin类:
-
使用接口而不是类。 在这种情况下,用相应的接口替换特定类的所有用法。 在测试代码中,你可以模拟界面。
interface Something { /* ... */ } class SomethingImpl : Something { /* ... */ } fun processSomething(something: Something) { /* ... */ } val something = mock(Something::class.java) processSomething(mock)
-
打开课程,这不是很方便。
-
使用PowerMock而不是Mockito。 使用
ClassLoader
你可以比Mockito做得更多。
我更喜欢第一种方法,因为即使不使用模拟框架,使用接口而不是类也是一个好主意。
运行espresso测试时,MockMaker插件似乎不起作用。 因此,您可以使用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