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