Das Problem, mit dem ich konfrontiert bin, ist die Matchers.anyObject()
Rückkehr null
. Wenn eine Methode verspottet wird, die nur nicht nullfähige Typen akzeptiert, wird die Ausnahme "Sollte nicht null sein" ausgelöst.
`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }
Verspottete Methode:
public open fun login(userCredentials: UserCredentials): Response
Antworten:
Es gibt zwei mögliche Problemumgehungen:
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 { ... } }
Die andere Problemumgehung ist
private fun <T> anyObject(): T { return Mockito.anyObject<T>() } @Test fun myTest() { `when`(mockedBackend).login(anyObject())).thenAnswer { ... } }
Hier finden Sie weitere Diskussionen zu diesem Thema, in denen zunächst die Problemumgehung vorgeschlagen wird.
quelle
kotlin.TypeCastException: null cannot be cast to non-null type X
.Für diejenigen, die getippt werden müssen
any(type: Class<T>)
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
Dies würde funktionieren und die Typprüfung findet auch statt!
quelle
inline fun <reified T> anyNonNull(): T = Mockito.any<T>(T::class.java)
Sie können die folgenden Hilfsfunktionen verwenden, um Mockitos Matcher any (), eq () und capture () in Kotlin zu verwenden:
/** * 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()
Siehe MockitoKotlinHelpers.kt aus dem Android Architecture Blueprints-Repository von Google.
quelle
Ich benutze
verify
viel, um sicherzustellen, dass die an eine Funktion übergebenen Parameter auch korrekt sind.Um dies zu tun und trotzdem die NPE zu vermeiden, können Sie den elvis-Operator von kotlin verwenden. zum Beispiel:
verify(mock).func(same(my_obj) ?: my_obj)
Auf diese Weise ist mockito zufrieden, weil es die Variable tatsächlich überprüft, und kotlin ist zufrieden, weil wir ein Nicht-Null-Objekt übergeben.
Eine andere Sache, auf die ich gestoßen bin, war die Mockito-Kotlin-Bibliothek, die genau dieses Problem löst: https://github.com/nhaarman/mockito-kotlin
quelle
Es muss nur ein nicht null Ergebnis zurückgegeben werden, wenn Sie verwenden
Mockito.any()
.Mockito.any() ?: 0 Mockito.any() ?: HashMap<Int,Int>() Mockito.any() ?: {}
...
quelle
Um die Antwort von @makovkastar zu erweitern, können Sie einen nullbaren oder nicht nullbaren Matcher wie folgt bereitstellen:
/** * Matcher that returns null */ private inline fun <reified T> any(): T = Mockito.any<T>() /** * Matcher never returns null */ private inline fun <reified T> any(type: Class<T>): T = Mockito.any(type)
quelle