Est-il possible d'utiliser Mockito dans Kotlin?
Le problème auquel je suis confronté est que Matchers.anyObject()
retourne null
. Lorsqu'il est utilisé pour simuler une méthode qui accepte uniquement les types Non nullables, il provoque une exception "ne devrait pas être null" à lever.
`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }
Méthode moquée:
public open fun login(userCredentials: UserCredentials): Response
4 réponses
Il y a deux solutions de contournement possibles:
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 { ... }
}
L'autre solution est
private fun <T> anyObject(): T {
return Mockito.anyObject<T>()
}
@Test
fun myTest() {
`when`(mockedBackend).login(anyObject())).thenAnswer { ... }
}
Ici un peu plus de discussion sur ce sujet, où la solution de contournement est d'abord proposé.
J'utilise beaucoup verify
pour m'assurer que les paramètres passés à une fonction sont également corrects.
Pour ce faire, et toujours éviter le NPE, vous pouvez utiliser l'opérateur elvis de kotlin.
exemple:
verify(mock).func(same(my_obj) ?: my_obj)
De cette façon, mockito est satisfait car il vérifie réellement la variable, et kotlin est satisfait parce que nous passons un objet non null.
Une autre chose sur laquelle je suis tombé était la bibliothèque mockito-kotlin qui résout exactement cela question https://github.com/nhaarman/mockito-kotlin
Pour ceux qui ont besoin tapé any(type: Class<T>)
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
Cela fonctionnerait et la vérification de type se produit également!
Vous pouvez utiliser les fonctions d'assistance suivantes pour utiliser les correspondances any(), EQ() et capture() de Mockito dans 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()
Voir MockitoKotlinHelpers.kt à partir du référentiel Blueprints D'Architecture Android de Google.