没有开放课程,可以和Kotlin一起使用Mockito吗?

正如我们可能知道的那样,默认情况下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

有三种方式我知道如何嘲笑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做得更多。

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

运行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