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