Mockito se burla de comportarse como espías: Kotlin

Estoy trabajando en un flask de kotlin en el que estoy tratando de burlar una input a una function

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

Sucede que memberFunction se ha agregado a esa class en mi package a través de una function de extensión de nivel de package

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

Ahora quiero escribir una testing para la function de serviceFunction , pero quiero memberFunction llamada de memberFunction (tengo testings separadas para eso).

Entonces, en mi testing de Mockito JUnit, hago lo siguiente

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

Esperaría que la implementación real de memberFunction nunca se llamara, y que mi simulacro interceptaría cualquier bash de llamarlo y en su lugar devolver mi mockFoo .

Lo que está sucediendo realmente es que whenever configuration para simular el método invoca la function subyacente , provocando una NullPointerException cuando el mapper intenta leer serializedFoo (que por supuesto es nulo).

Mi pregunta es: ¿por qué en la tierra se está ejecutando la function memberFunction real? Soy nuevo en Mockito y Kotlin, pero he usado testings de Jasmine (para JS) y Spock (para Groovy / Java) en el pasado, y burlarme de un object en esos dos frameworks nunca ejecutaría en realidad ninguna function que se haya descartado ( que yo sepa)

He podido solucionar problemas similares a esto en el pasado al hacer que la ClassFromAnotherLibrary que estoy tratando de burlar tenga una interface que me burle, pero que

  1. Se siente hacky, y
  2. No es una opción en este caso (no es de mi class para editar, viene de otra biblioteca)

Como reference, estas son las dependencies gradle relevantes que mi proyecto está utilizando:

 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" 

También configuré un file MockMaker en mi carpeta de test/resources para habilitar el MockMaker en mock-maker-inline , aunque no entiendo totalmente qué es lo que podría lograr (vi un consejo al respecto aquí )

Gracias a cualquier Kotlin / Mockito