[JAVA] Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin

Bitte beachten Sie, dass dieser Artikel nicht beschreibt, wie Mockito selbst verwendet wird. Enthält viele Beschreibungen für Android.

Probleme, die auftreten, wenn sie so verwendet werden, wie sie sind

Wenn Sie Mockito wie in Kotlin verwenden, erhalten Sie den folgenden Code.

val sharedPreferences = mock(SharedPreferences::class.java)
val editor = mock(SharedPreferences.Editor::class.java, RETURNS_DEEP_STUBS)

`when`(sharedPreferences.edit()).thenReturn(editor)
`when`(editor.commit()).thenReturn(true)
`when`(editor.putString(anyString(), anyString())).thenReturn(editor)

Der obige Code ist der Code, der die SharedPreferences von Android verspottet. sharedPreferences.edit () gibt einen verspotteten Editor zurück, mit dem Sie commit () und putString () verwenden können.

Die mock () Methode, die das Mock-Objekt erstellt, ist in Ordnung, aber der Teil der when () -Methode, der das Verhalten des Mock-Objekts bestimmt, ist von Anführungszeichen umgeben, was sehr schwer zu erkennen ist.

Natürlich gibt es kein Problem, aber diesmal ist es eine Bibliothek, die den Code zu einem Teil dieses Modells macht, das eher Kotlin, ** mockito-kotlin ** ähnelt. Ich würde gerne Kotlin verwenden.

Umgebung

Abhängigkeit hinzufügen

Fügen Sie auf jede Weise Bibliotheksreferenzen hinzu, z. B. Gradle oder Maven.

//testImplementation ist an die Umgebung angepasst
testImplementation "com.nhaarman:mockito-kotlin:1.5.0"

Wie benutzt man

Erstellen eines Scheinobjekts

Anstatt die Klasse als Argument zu übergeben, wird sie von Generika angegeben.

val sharedPreferences = mock<SharedPreferences> {}

Die im zweiten und den nachfolgenden Argumenten übergebenen Optionen werden weiterhin in den Methodenargumenten beschrieben.

val editor = mock<SharedPreferences.Editor>(defaultAnswer = RETURNS_DEEP_STUBS) { }

Der gesamte Inhalt von withSettings () kann auch als Argument übergeben werden.

//Folgende Argumente können verwendet werden(1.5.0 vorhanden)
extraInterfaces: Array<KClass<out Any>>? = null
name: String? = null
spiedInstance: Any? = null
defaultAnswer: Answer<Any>? = null
serializable: Boolean = false
serializableMode: SerializableMode? = null
verboseLogging: Boolean = false
invocationListeners: Array<InvocationListener>? = null
stubOnly: Boolean = false
useConstructor: Boolean = false
outerInstance: Any? = null
stubbing: KStubbing<T>.(T) -> Unit

Angeben des Verhaltens des Scheinobjekts

Verwenden Sie nicht "when", sondern beschreiben Sie es im Funktionsargument "{}", wenn Sie ein Modell erstellen. Verwenden Sie "on {method to mock ()}", um die Methode zum Verspotten des Verhaltens anzugeben, gefolgt von "doReturn", "doAnswer" und "doThrow". Der folgende Code entspricht dem am Anfang des Artikels eingeführten Mockito-Code.

val editor = mock<SharedPreferences.Editor>(defaultAnswer = RETURNS_DEEP_STUBS) {
    on { commit() } doReturn true
    on { putString(anyString(), anyString()) } doReturn it
}
val sharedPreferences = mock<SharedPreferences> {
    on { edit() } doReturn editor
}

//Unten ist der Code am Anfang des Artikels
val sharedPreferences = mock(SharedPreferences::class.java)
val editor = mock(SharedPreferences.Editor::class.java, RETURNS_DEEP_STUBS)

`when`(sharedPreferences.edit()).thenReturn(editor)
`when`(editor.commit()).thenReturn(true)
`when`(editor.putString(anyString(), anyString())).thenReturn(editor)

doReturn

Der kontinuierlich geschriebene Wert ist der Rückgabewert der zu verspottenden Methode. Wenn der Rückgabewert "void" oder "Unit" ist, gibt es kein Problem, wenn Sie "Unit" zurückgeben.

val stringMock = mock<String> {
    on { toString() } doReturn "mocked"
}
stringMock.toString() // => "mocked"

doAnswer

Schreiben Sie eine Funktion, die ein verspottetes Objekt als Empfänger verwendet und den Typ zurückgibt, den die Methode zurückgeben soll. Es ist wie "lassen".

val stringMock = mock<String> {
    on { toString() } doAnswer { "mocked" + it.hashCode() }
}
stringMock.toString() // => "mocked[Zahlen]"

doThrow

Wirf die Ausnahme, die du nacheinander geschrieben hast.

val stringMock = mock<String> {
    on { toString() } doThrow RuntimeException()
}
stringMock.toString() // => RuntimeException

abschließend

Sie können "any ()" und "argThat ()" verwenden, um das Argument der zu verspottenden Methode anzugeben, daher denke ich, dass die Grundlagen kein Problem darstellen werden. Bei anderen Schreibmethoden ist es leicht zu verstehen, wenn Sie sich das Github-Wiki und den Testcode ansehen. Wenn Sie also nicht wissen, wie man es schreibt, sollten Sie es sich ansehen.

Wiki: https://github.com/nhaarman/mockito-kotlin/wiki/Mocking-and-verifying Testcode: https://github.com/nhaarman/mockito-kotlin/tree/2.x/tests/src/test/kotlin/test

Recommended Posts

Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
Wenn Sie es wagen, Integer mit "==" zu vergleichen ...
Wenn Sie Oracle JDK 11 ab September verwenden möchten (fügen Sie Amazon Corretto hinzu)
Wenn Sie mit Ruby eine Zip-Datei erstellen möchten, ist dies Rubyzip.
Wenn Sie Datenbankspalten usw. ändern möchten.
Sie verwenden den Kontext, um MDC mit Spring WebFlux zu verwenden
Ich möchte Java8 für jeden mit Index verwenden
Wenn Sie die Methode außerhalb verwenden möchten
Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen
Wenn Sie die Spring Boot + Thymeleaf-Verarbeitung trennen möchten
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Wenn Sie SQLite mit VSCode verwenden, verwenden Sie die Erweiterung (wie die Binärdatei von sqlite3 angezeigt wird)
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
Verwendung des mit Tensorflow 2.0 trainierten Modells mit Kotlin / Java
Wenn Sie Programmieren an der Universität studieren möchten, gehen Sie nach Australien
[# 3 Java] Lesen Sie dies, wenn Sie Java lernen möchten! ~ Sorgfältig ausgewählt ~
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Wenn Sie explizit ODER oder UND mit Ransack schreiben möchten
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
docker-compose.yml, wenn Sie MySQL auf Docker laufen lassen möchten
lombok.config, wenn Sie @Qualifier mit lombok an @RequiredArgsConstructor übergeben möchten
Delicate ist praktisch, wenn Sie Teile wiederverwenden möchten
Was tun, wenn der Befehl Rails unbrauchbar wird?
Sie müssen winpty mit Docker Exec [Windows] verwenden.
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
Was tun, wenn Sie sich über OpenSSL mit pyenv install ärgern?
Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
Üben Sie die Verwendung, wenn Sie verschiedene Verarbeitungsgruppen seriell ausführen möchten
[Rails] Was tun, wenn Sie mit form_with keine Parameter abrufen können?
Zusammenfassung der Mittel, wenn Sie mit HTTP unter Android kommunizieren möchten
Wenn Sie Werte dynamisch einbetten und Attributwerten in Thymeleaf 3 Text hinzufügen möchten
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Verwendung von BootStrap mit Play Framework
Grundlegende Rails-Befehle, die Sie lernen möchten
Ich möchte @Autowired in Servlet verwenden
Was tun, wenn Sie aktiviert haben? Verwenden Sie die WSL2-basierte Engine in Docker Desktop mit unzureichender WSL2-Installation
So funktioniert @Transactional, das nicht funktioniert, wenn Sie es falsch verwenden
Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden
Wenn Sie Android Room verwenden und die Spaltendefinition ändern möchten
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
[Eclipse] Ich möchte die Abschlussfunktion verwenden, aber ich möchte es schaffen, den Abschluss mit einem Leerzeichen zu bestätigen
[Spring Boot] Wenn Sie Spring Boot verwenden, war es praktisch, viele Dienstprogramme zu verwenden.
Wenn Sie mit Ajax null auf Servlet werfen, wird es in leer "" konvertiert.
Wie man jeden Fall mit Mockito 1x verspottet
Verwendung des eingebauten h2db mit Federstiefel
Mit Tomcat können Sie Platzhalter ($ {...}) in web.xml verwenden.
Wenn Sie InputStream in JDBI3 binden möchten
Was tun, wenn Sie falsche Informationen eingeben?
[Swift] Verwenden Sie nonzeroBitCount, wenn Sie in Swift popcnt möchten
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
Super einfache Möglichkeit, Enum mit JSP zu verwenden