Mockito bei Kotlinany()
OderisA()
Wenn Sie verwenden```java.lang.IllegalStateException: Mockito.any() must not be null
Dieser Fehler tritt in Null-safe Kotlin nicht auf, da diese Methoden null zurückgeben (wenn es sich um einen primitiven Typ handelt, wird der Standardwert zurückgegeben, sodass dieser Fehler nicht auftritt).
Wenn Sie das zu überprüfende Methodenargument auf Nullable setzen, wird das Problem natürlich gelöst, aber das möchten Sie nicht.
Zum Beispiel möchte ich den folgenden Teil verspotten und das Argument überprüfen.
```kotlin
transition.onNext(TransitionType.Success())
Da der tatsächliche Code und der Test zum Zeitpunkt der Überprüfung unterschiedliche Instanzen sind, möchte ich überprüfen, ob sie dieselbe Klasse sind. Also schreibe ich es so.
Mockito.doNothing().`when`(mockEventBus).onNext(Mockito.isA(TransitionType.Success::class.java))
Dies führt zu einem Fehler.
Wenn Sie es wie folgt umwandeln: `nullReturn ()`
, wird es funktionieren.
class TestUtils private constructor() {
companion object {
fun <T> isA(type: Class<T>): T {
Mockito.isA<T>(type)
return nullReturn()
}
fun <T> any(): T {
Mockito.any<T>()
return nullReturn()
}
private fun <T> nullReturn(): T = null as T
}
}
Mockito.doNothing().`when`(mockEventBus).onNext(TestUtils.isA(TransitionType.Success::class.java))
Aus unbekannten Gründen kann Kotlin die Compiler-Nullprüfung umgehen, indem er null umwandelt, z. B. "null als Zeichenfolge". Da ich es in eine NotNull-Klasse umwandle, wird es tatsächlich als NotNull beurteilt, selbst wenn es null ist? (Zur Laufzeit wird es mit `` `TypeCastException``` gelöscht.) Aus irgendeinem Grund funktioniert das Casting in Generics auch zur Laufzeit.
Recommended Posts