Le problème auquel je suis confronté est que Matchers.anyObject()
renvoie null
. Lorsqu'il est utilisé pour simuler une méthode qui accepte uniquement les types non nullables, il provoque une exception "ne doit pas être null" levée.
`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }
Méthode moquée:
public open fun login(userCredentials: UserCredentials): Response
Il existe deux solutions 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 { ... }
}
Voici n peu plus de discussion sur ce sujet, où la solution de contournement est d'abord suggérée.
Pour ceux qui ont besoin de taper 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 égaliseurs 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 Android référentiel Architecture Blueprints de Google.
J'utilise beaucoup verify
pour m'assurer que les paramètres transmis à une fonction sont également corrects.
Pour ce faire, et toujours éviter le NPE, vous pouvez utiliser l'opérateur elvis de kotlin. par 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 nul.
Une autre chose sur laquelle je suis tombé est la bibliothèque mockito-kotlin qui résout exactement ce problème https://github.com/nhaarman/mockito-kotlin