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
38
demandé sur atok 2015-05-18 16:58:34

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é.

41
répondu Sergey Mashkov 2016-08-21 21:54:37

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

9
répondu maxandron 2016-03-03 15:22:06

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!

6
répondu Shamm 2018-02-15 10:38:06

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.

5
répondu makovkastar 2018-03-16 15:56:41