Kotlin mit Mockito

1. Einleitung

Kotlin und Java gehen Hand in Hand. Dies bedeutet, dass wir die große Anzahl vorhandener Java-Bibliotheken in unseren Kotlin-Projekten nutzen können.

In diesem kurzen Artikel werden wir sehen, wie wir Mockito in Kotlin verspotten können. Wenn Sie mehr über die Bibliothek erfahren möchten, lesen Sie diesen Artikel.

2. Setup

Lassen Sie uns zunächst ein Maven-Projekt erstellen und JUnit- und Mockito-Abhängigkeiten in die Datei pom.xml einfügen:

 org.mockito mockito-core 3.3.3 test   junit junit 4.12 test 

Wir müssen Maven auch mitteilen, dass wir mit Kotlin zusammenarbeiten, damit es den Quellcode für uns kompiliert. Weitere Informationen zur Konfiguration finden Sie in der offiziellen Kotlin-Dokumentation in der Datei pom.xml .

3. Verwenden von Mockito mit Kotlin

Angenommen, wir haben eine Implementierung, die wir testen möchten - LendBookManager . Diese Klasse ist von einem Dienst namens BookService abhängig , der noch nicht implementiert ist:

interface BookService { fun inStock(bookId: Int): Boolean fun lend(bookId: Int, memberId: Int) } 

Der BookService wird während der Instanziierung von LendBookManager injiziert und während der gesamten Checkout- Methode zweimal verwendet. Dies ist die Methode, für die wir unseren Test schreiben müssen:

class LendBookManager(val bookService:BookService) { fun checkout(bookId: Int, memberId: Int) { if(bookService.inStock(bookId)) { bookService.lend(bookId, memberId) } else { throw IllegalStateException("Book is not available") } } } 

Es wäre schwierig, Unit-Tests für diese Methode zu schreiben, ohne BookService verspotten zu können - hier bietet sich Mockito an.

Wir können mit nur zwei Codezeilen ein Modell der BookService- Schnittstelle erstellen und sie anweisen, einen festen Wert zurückzugeben, wenn die inStock () -Methode aufgerufen wird:

val mockBookService = Mockito.mock(BookService::class.java) Mockito.`when`(mockBookService. inStock(100)).thenReturn(true) 

Dadurch wird die mockBookService- Instanz gezwungen , true zurückzugeben, wenn die inStock () -Methode mit dem Argument 100 aufgerufen wird (beachten Sie, dass wir die when () -Methode mit dem Backtick umgehen mussten; dies ist erforderlich, da wann ein reserviertes Schlüsselwort in der Kotlin-Sprache ist ).

Wir können diese verspottete Instanz dann während der Instanziierung an LendBookManager übergeben , die zu testende Methode aufrufen und überprüfen, ob die lend () -Methode als Ergebnis der Operation aufgerufen wurde:

val manager = LendBookManager(mockBookService) manager.checkout(100, 1) Mockito.verify(mockBookService).lend(100, 1) 

Wir können schnell den anderen logischen Pfad der Implementierung unserer Methode testen, der eine Ausnahme auslösen sollte, wenn das gewünschte Buch nicht auf Lager ist:

@Test(expected = IllegalStateException::class) fun whenBookIsNotAvailable_thenAnExceptionIsThrown() { val mockBookService = Mockito.mock(BookService::class.java) Mockito.`when`(mockBookService. inStock(100)).thenReturn(false) val manager = LendBookManager(mockBookService) manager.checkout(100, 1) } 

Bemerkt , dass für diesen Test haben wir gesagt mockBookService zurückzukehren falsch , wenn Sie gefragt , ob das Buch mit der ID 100 auf Lager ist. Dies sollte dazu führen, dass der Aufruf von checkout () eine IllegalStateException auslöst .

Wir verwenden die erwartete Eigenschaft in der @ Test- Annotation, was darauf hinweist, dass wir erwarten, dass dieser Test eine Ausnahme auslöst .

4. Mockito Kotlin Bibliothek

Mit einer Open-Source-Bibliothek namens mockito-kotlin können wir unseren Code Kotlin-ähnlicher gestalten. Diese Bibliothek umschließt einige der Funktionen von Mockito mit seinen Methoden und bietet eine einfachere API:

@Test fun whenBookIsAvailable_thenLendMethodIsCalled() { val mockBookService : BookService = mock() whenever(mockBookService.inStock(100)).thenReturn(true) val manager = LendBookManager(mockBookService) manager.checkout(100, 1) verify(mockBookService).lend(100, 1) }

Es bietet auch seine Version der mock () -Methode. Bei Verwendung dieser Methode können wir die Typinferenz nutzen, um die Methode aufzurufen, ohne zusätzliche Parameter zu übergeben.

Schließlich stellt diese Bibliothek eine neue when () -Methode zur Verfügung, die frei verwendet werden kann, ohne dass Back-Ticks erforderlich sind, wie dies bei Verwendung der nativen when () -Methode von Mockito erforderlich war .

Überprüfen Sie ihr Wiki für eine vollständige Liste der Verbesserungen.

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir uns angesehen, wie wir unser Projekt so einrichten, dass Mockito und Kotlin zusammen verwendet werden, und wie wir diese Kombination nutzen können, um Verspottungen zu erstellen und effektive Komponententests zu schreiben.

Wie immer können Sie die vollständige Quelle im GitHub-Repo überprüfen.