mock cannot because java mocking mockito kotlin

java - cannot - ¿Es posible usar Mockito en Kotlin?



kotlin mockito any (4)

Hay dos soluciones posibles:

private fun <T> anyObject(): T { Mockito.anyObject<T>() return uninitialized() } private fun <T> uninitialized(): T = null as T @Test fun myTest() { `when`(mockedBackend).login(anyObject())).thenAnswer { ... } }

La otra solución es

private fun <T> anyObject(): T { return Mockito.anyObject<T>() } @Test fun myTest() { `when`(mockedBackend).login(anyObject())).thenAnswer { ... } }

Aquí hay más discusión sobre este tema, donde primero se sugiere la solución.

El problema al que me enfrento es que Matchers.anyObject() devuelve null . Cuando se usa para simular un método que solo acepta tipos no anulables, provoca una excepción "No debe ser nula".

`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }

Método burlado:

public open fun login(userCredentials: UserCredentials): Response


Para aquellos que necesitan escribir any(type: Class<T>)

private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)

¡Esto funcionaría y la verificación de tipo también ocurre!


Puede usar las siguientes funciones auxiliares para usar los emparejadores any (), eq () y capture () de Mockito en Kotlin:

/** * Returns Mockito.eq() as nullable type to avoid java.lang.IllegalStateException when * null is returned. * * Generic T is nullable because implicitly bounded by Any?. */ fun <T> eq(obj: T): T = Mockito.eq<T>(obj) /** * Returns Mockito.any() as nullable type to avoid java.lang.IllegalStateException when * null is returned. */ fun <T> any(): T = Mockito.any<T>() /** * Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException * when null is returned. */ fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()

Consulte MockitoKotlinHelpers.kt del repositorio de Blueprints de Android Architecture de Google.


Utilizo verify mucho para asegurarme de que los parámetros pasados ​​a una función también sean correctos.

Para hacer esto, y aún así evitar el NPE, puede usar el operador elvis de kotlin. por ejemplo: verify(mock).func(same(my_obj) ?: my_obj)

De esta manera, mockito está satisfecho porque realmente verifica la variable, y kotlin está satisfecho porque pasamos un objeto no nulo.

Otra cosa con la que me topé fue la biblioteca mockito-kotlin que resuelve exactamente este problema https://github.com/nhaarman/mockito-kotlin