有没有可能在不开课的情况下与Kotlin一起使用Mockito



我们可能知道,默认情况下,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类:

  1. 使用接口而不是类。在这种情况下,您可以用相应的接口替换特定类的所有用法。在测试代码时,您可以模拟接口。

    interface Something { /* ... */ }
    class SomethingImpl : Something { /* ... */ }
    fun processSomething(something: Something) { /* ... */ }
    val something = mock(Something::class.java)
    processSomething(mock)
    
  2. 开课,这不是很方便。

  3. 使用PowerMock而不是Mockito。使用它的ClassLoader,你可以做比Mockito多得多的事情。

我更喜欢第一种方法,因为即使不使用模拟框架,使用接口而不是类也是一个好主意。

相关内容

  • 没有找到相关文章