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
- ¿Es posible usar doReturn () y CALLS_REAL_METHODS con mockito-kotlin?
- ¿No es posible establecer expectativas sobre una propiedad perezosa?
- Prueba de unidad Kotlin para parámetro de function y object
- Mocking methods de Kotlin con Java + Mockito
- Usando Mockito doAnswer en Kotlin
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
- Se siente hacky, y
- 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
- Cómo alinear manualmente la diversión de Kotlin con <reified T: Any>
- Androide. Mockito usa objects reales en lugar de simulacro
- MissingMethodInvocationException probando una class abierta en Kotlin
- Cómo probar el observador?
- Kotlin + SpringBoot 2.0.0-M4 falló en el context de la aplicación de carga (BeanCreationException)
- kotlin testing con mockito: fracaso de comparación
- burlarse de la respuesta anidada del server
- ArgumentCaptor capture regresa nulo
Las funciones de extensión no son más que un método estático regular de Java y, por lo que recuerdo, Mockito no puede simular methods estáticos.
- llamar parte de la secuencia una vez con múltiples suscriptores?
- Corotines de Kotlin: ajuste el uso sincrónico de cassandra frente a la traducción del uso asynchronous