Mockito嘲笑像间谍:Kotlin

我正在研究一个kotlin jar,我试图模拟一个函数的输入

class MyService fun serviceFunction(input: ClassFromAnotherLibrary): Output { val foo = input.memberFunction() 

只是碰巧, memberFunction已经通过包级扩展函数被添加到我的包中的那个类

 fun ClassFromAnotherLibrary.memberFunction() : Foo { val mapper = jacksonObjectMapper() return mapper.readValue(this.serializedFoo, Foo::class.java) } 

现在我想写一个serviceFunction的测试,但我想嘲笑memberFunction调用(我有单独的测试)。

所以在我的Mockito JUnit测试中,我做了以下

 val service = Service() val mockClassFromAnotherLibrary = mock<ClassFromAnotherLibrary>() val mockFoo = mock<Foo>() whenever(mockClassFromAnotherLibrary.memberFunction()) .thenReturn(mockFoo) service.serviceFunction(mockClassFromAnotherLibrary) 

我期望memberFunction的实际实现永远不会被调用,而且我的模拟会拦截任何尝试调用它,而是返回我的mockFoo

实际上whenever设置模拟出调用底层函数的方法时,当mapper尝试读取serializedFoo (当然是null)时,会导致NullPointerException

我的问题是: 为什么地球上真正的memberFunction被执行? 我是Mockito和Kotlin的新手,但过去曾经使用Jasmine(用于JS)和Spock(用于Groovy / Java)测试,并且在这两个框架中嘲笑对象将永远不会实际执行任何嘲讽函数我知道)。

我已经能够解决类似于这个过去的问题,通过使我从模拟的ClassFromAnotherLibrary有一个interface ,我嘲笑,而是

  1. 感觉哈克,和
  2. 在这种情况下不是一个选项(这不是我的课程编辑,它来自另一个库)

作为参考,这些是我的项目正在使用的相关的gradle依赖关系:

 compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.8.9" compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.9" compile "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.9" testCompile 'junit:junit:4.12' testCompile "org.jetbrains.kotlin:kotlin-test:1.1.4-3" testCompile "org.jetbrains.kotlin:kotlin-test-junit:1.1.4-3" testCompile "com.nhaarman:mockito-kotlin:1.3.0" testCompile "org.mockito:mockito-inline:2.8.47" 

我也在我的test/resources文件夹中建立了一个MockMaker文件来启用mock-maker-inline ,但是我不完全明白它可能完成什么(在这里看到一个提示)

感谢任何Kotlin / Mockito

扩展函数不过是一个常规的Java静态方法,据我所知,Mockito不能嘲笑静态方法。