Ich versuche zu testen ViewModel um sicherzustellen, dass Livedaten korrekt aktualisiert werden. Allerdings bei der Nutzung ArgumentMatchers.any() es scheitert mit IllegalStateException Sprichwort:
ArgumentMatchers.any(mViewModel.CountSubscriber::class.java) darf nicht null sein
@Test
fun emitValueIfCountIs7() {
doAnswer { invocation: InvocationOnMock ->
val subscriber: mViewModel.CountSubscriber = invocation.getArgument(0)
subscriber.onNext(7)
null
}.`when`(countUseCase).execute(
ArgumentMatchers.any(mViewModel.CountSubscriber::class.java),
ArgumentMatchers.any(Parameters::class.java)
)
// When
mViewModel.getCount()
// Verify
assert(mViewModel.countResponse.value != null)
}
Ich verwende Kotlin und habe folgende Abhängigkeiten:
Seltsam ist, dass es früher funktioniert hat, und ich weiß nicht, was passiert ist, das dies beeinflussen könnte.
Können Sie Ihre Importe posten? IIRC dies kann passieren, wenn der Nicht-Kotlin-Matcher mit Kotlin-Code verwendet wird.
– fweigl
7. Dezember 2019 um 21:11 Uhr
Ich habe die Frage mit Importen aktualisiert.
– Ana Koridze
7. Dezember 2019 um 21:53 Uhr
ArgumentMatchers.any(Class type) gibt immer null zurück, egal welches Objekt ich versuche abzugleichen
– Ana Koridze
8. Dezember 2019 um 10:43 Uhr
Sie hatten Recht, ich habe org.mockito-Abhängigkeiten durch com.nhaarman.mockitokotlin2 ersetzt und jetzt funktioniert es!
– Ana Koridze
8. Dezember 2019 um 11:01 Uhr
Nabzi
Matcher dazu zu bringen, mit Kotlin zu arbeiten, kann ein Problem sein. Wenn Sie eine in Kotlin geschriebene Methode haben, die keinen Nullable-Parameter akzeptiert, können wir sie nicht mit Mockito.any() abgleichen. Dies liegt daran, dass es void zurückgeben kann und dies keinem Nicht-Nullable-Parameter zuweisbar ist.
Wenn die abgeglichene Methode in Java geschrieben ist, wird sie meiner Meinung nach funktionieren, da alle Java-Objekte implizit nullable sind.
Eine mögliche Lösung wäre die Verwendung einer Bibliothek wie mockito-kotlin
Aber Sie können dieses Problem leicht mit ein paar Zeilen Code selbst lösen.
Wenn Sie etwas eingeben müssen (Typ: Klasse)
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
ODER
Sie können diesen Matcher anstelle von Matchers.any() verwenden:
object MockitoHelper {
fun <T> anyObject(): T {
Mockito.any<T>()
return uninitialized()
}
@Suppress("UNCHECKED_CAST")
fun <T> uninitialized(): T = null as T
}
und verwenden MockitoHelper.anyObject() Anstatt von any() in Ihren Kotlin-Tests.
In diesem Beitrag wird über mögliche Lösungen diskutiert: Ist es möglich, Mockito in Kotlin zu verwenden?
Vielen Dank für diese Erklärung und diese Antworten. Die erste getippte Klasse fn hat bei mir perfekt funktioniert.
– Orpheus
31. Oktober 2021 um 19:12 Uhr
Das ist die falsche Antwort. Die richtige Antwort ist, dass Sie nur verwenden müssen import kotlin.any Anstatt von import mockito.any und es funktioniert.
– Alex Arvanitidis
31. August um 8:04 Uhr
Dies funktioniert nicht (mehr?) – es scheint, dass der Kotlin-Compiler jetzt intelligent genug ist, um nicht durch die ungeprüfte Umwandlung von null in T verwirrt zu werden
– Bastian Voigt
7. September um 8:47
Haomin
Die richtige Lösung wird im Kommentarbereich der Frage von @Ana Koridze erwähnt. Ja, wenn Sie Koltin + mockitoKotlin verwenden. Stellen Sie sicher, dass Sie den folgenden Import verwenden:
1 – Verwenden des Mockito-kotlin:
import org.mockito.kotlin.any von Mockito-kotlin statt import org.mockito.Mockito.any
Übrigens, wenn Sie Android Studio oder IntelliJ IDEA verwenden. das any() aus der Mockitokotlin-Bibliothek sein sollte italic standardmäßig Stil/Farbschema.
Beachten Sie die any() am Zeilenende. Das ist von mockitokotlin
Und hier ist die any() aus Mockito
Danke @Sattar für die empfohlene Bearbeitung.
das einzige was bei mir funktioniert hat. Danke @Haomin
– Nouman Ch
10. März 2021 um 18:54 Uhr
Ich hatte das gleiche Problem und habe dann Ihre Antwort gelesen und meine Importe überprüft und jetzt funktioniert es! Vielen Dank!
– MarounG
6. Oktober 2021 um 10:18 Uhr
Du hast meinen Tag gerettet. Vielen Dank!
– Arkadi
8. November 2021 um 12:41 Uhr
mockito-kotlin hat Unterstützung für Nullable-Argumente mit hinzugefügt anyOrNull()
Dies wird alles verwenden, was für Kotlin funktioniert, da dies eine Wrapper-Bibliothek für Mockito, aber für Kotlin ist
bastami82
Das hat bei mir funktioniert,
entweder alle generischen ersetzt any()s , mit einem bestimmten anyTYPE(), dh anyInt(), anyList() usw. von der Kernbibliothek org.mockito:mockito-core und es behebt das Problem (nullability), es scheint, dass die spezifischen Definitionen mit Typ null verarbeiten können. Bei dieser Option müssen Sie keine zusätzlichen Bibliotheken importieren
oder
wenn Sie wirklich den generischen Typ verwenden müssen any() fügen Sie diese offizielle Mckito-Erweiterung lib hinzu https://github.com/mockito/mockito-kotlin und stellen Sie sicher, dass Sie die verwenden any() aus dieser Bibliothek (indem Sie sicherstellen, dass Ihre Importe dies enthalten import org.mockito.kotlin.any)
Ich schlage vor, MockK lib zu verwenden https://github.com/mockk/mockk anstelle von Mockito, da es a ist Mock Bibliothek für Kotlin = MockK)
Wenn Sie sich jedoch zu faul fühlen, jetzt zu wechseln oder sich mit Legacy-Tests zu befassen (wie in meinem Fall :), sollte dies auch Ihr Problem beheben.
Können Sie Ihre Importe posten? IIRC dies kann passieren, wenn der Nicht-Kotlin-Matcher mit Kotlin-Code verwendet wird.
– fweigl
7. Dezember 2019 um 21:11 Uhr
Ich habe die Frage mit Importen aktualisiert.
– Ana Koridze
7. Dezember 2019 um 21:53 Uhr
ArgumentMatchers.any(Class type) gibt immer null zurück, egal welches Objekt ich versuche abzugleichen
– Ana Koridze
8. Dezember 2019 um 10:43 Uhr
Sie hatten Recht, ich habe org.mockito-Abhängigkeiten durch com.nhaarman.mockitokotlin2 ersetzt und jetzt funktioniert es!
– Ana Koridze
8. Dezember 2019 um 11:01 Uhr