ArgumentMatchers.any darf nicht null sein

Lesezeit: 5 Minuten

Benutzeravatar von Ana Koridze
Ana Koridze

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:

testImplementation 'junit:junit:4.12'
testImplementation "org.mockito:mockito-inline:2.23.4"
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"

Hier meine Importe:

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.nhaarman.mockitokotlin2.doAnswer
import io.reactivex.Observable
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentMatchers.any
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
import org.mockito.invocation.InvocationOnMock

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

Nabzis Benutzeravatar
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.

Weitere Informationen finden Sie in diesem Beitrag: Verwenden von Mockito mit Kotlin

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

Benutzeravatar von Haomin
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

testImplementation "org.mockito.kotlin:mockito-kotlin:$mockito_kotlin_version"

2 – Oder wenn Sie eine ältere Mockito-Kotlin-Version verwenden, die ursprünglich von nhaarman vor der Intergation erstellt wurde

import com.nhaarman.mockitokotlin2.any von nhaarams Mockito-kotlin statt import org.mockito.Mockito.any

testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:$mockito_kotlin2_version"

Ü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

Geben Sie hier die Bildbeschreibung ein

Und hier ist die any() aus Mockito

Geben Sie hier die Bildbeschreibung ein

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()

        `when`(myMock.doesThis(any(), anyOrNull())).thenReturn(someObject)

verwenden Mockito-kotlin

testImplementation "org.mockito.kotlin:mockito-kotlin:$mockito_kotlin_version"

Dies wird alles verwenden, was für Kotlin funktioniert, da dies eine Wrapper-Bibliothek für Mockito, aber für Kotlin ist

Benutzeravatar von bastami82
bastami82

Das hat bei mir funktioniert,

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

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

Benutzeravatar von Gad Wissberg
Gad Wißberg

Für mich waren alle oben genannten Lösungen nicht genug – außerdem musste ich die aufgerufene Methode als ‘offene’ Methode markieren. Demzufolge:
https://github.com/mockito/mockito-kotlin/wiki/Parameter-specified-as-non-null-is-null
Die Methode ist endgültig und Mockito konnte sie nicht verspotten, also musste ich ‘open’ hinzufügen.

1394980cookie-checkArgumentMatchers.any darf nicht null sein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy