Kotlin met Mockito

1. Inleiding

Kotlin en Java gaan hand in hand. Dit betekent dat we het enorme aantal bestaande Java-bibliotheken kunnen gebruiken in onze Kotlin-projecten.

In dit korte artikel zullen we zien hoe we Mockito in Kotlin kunnen bespotten. Raadpleeg dit artikel als je meer wilt weten over de bibliotheek.

2. Installatie

Laten we eerst een Maven-project maken en JUnit- en Mockito-afhankelijkheden toevoegen in het pom.xml:

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

We moeten Maven ook vertellen dat we met Kotlin werken, zodat het de broncode voor ons compileert. Bekijk de officiële Kotlin-documentatie voor meer informatie over het configureren van dat in het pom.xml.

3. Met behulp van Mockito met Kotlin

Stel dat we een implementatie hebben die we willen testen - LendBookManager. Deze klasse is afhankelijk van een service, genaamd Boekservice, die nog niet is geïmplementeerd:

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

De Boekservice wordt geïnjecteerd tijdens de instantiatie van LendBookManager en wordt tweemaal gebruikt in de uitchecken methode, de methode waarvoor we onze test moeten schrijven:

class LendBookManager (val bookService: BookService) {fun checkout (bookId: Int, memberId: Int) {if (bookService.inStock (bookId)) {bookService.lend (bookId, memberId)} anders {throw IllegalStateException ("Boek is niet beschikbaar ")}}} 

Het zou moeilijk zijn om unit-tests voor die methode te schrijven zonder de mogelijkheid te hebben om te bespotten Boekservice - dat is waar Mockito van pas komt.

We kunnen, met slechts twee regels code, een mock maken van de Boekservice interface en instrueer het om een ​​vaste waarde te retourneren wanneer de op voorraad() methode heet:

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

Dit zal het mockBookService instantie om terug te keren waar wanneer de op voorraad() methode wordt aangeroepen met het argument 100 (merk op dat we moesten ontsnappen aan de wanneer() methode met behulp van de backtick; dit is vereist sinds wanneer is een gereserveerd trefwoord in de Kotlin-taal).

We kunnen deze bespotte instantie dan doorgeven aan LendBookManager Roep tijdens de instantiatie de methode aan die we willen testen en controleer of de lenen() methode is aangeroepen als resultaat van de bewerking:

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

We kunnen snel het andere logische pad van de implementatie van onze methode testen, wat een uitzondering zou moeten opleveren als het gewenste boek niet op voorraad is:

@Test (verwacht = IllegalStateException :: class) fun whenBookIsNotAvailable_thenAnExceptionIsThrown () {val mockBookService = Mockito.mock (BookService :: class.java) Mockito `wanneer` (mockBookService. InStock (100)). ThenReturn (false) val manager = LendBookManager (mockBookService) manager.checkout (100, 1)} 

Merkte op dat we voor deze test verteldemockBookService terugbrengen false op de vraag of het boek met id 100 op voorraad was. Dit zou de uitchecken() aanroep om een IllegalStateException.

Wij gebruiken de verwacht eigendom op de @Test annotatie, wat aangeeft dat we verwachten dat deze test een uitzondering genereert.

4. MockitoKotlin Bibliotheek

We kunnen onze code meer Kotlin-achtig laten lijken door een open-sourcebibliotheek genaamd mockito-kotlin te gebruiken. Deze bibliotheek wikkelt een deel van de functionaliteit van Mockito rond zijn methoden, waardoor een eenvoudigere API wordt geboden:

@Test plezier whenBookIsAvailable_thenLendMethodIsCalled () {val mockBookService: BookService = mock () wanneer (mockBookService.inStock (100)). ThenReturn (true) val manager = LendBookManager (mockBookService) manager.checkout (100, 1) verifiëren (mockBookService) .lend (100, 1)}

Het biedt ook de versie van de bespotten() methode. Wanneer we deze methode gebruiken, kunnen we gebruik maken van type-inferentie, zodat we de methode kunnen aanroepen zonder aanvullende parameters door te geven.

Eindelijk dit bibliotheek onthult een nieuw wanneer () methode die vrij kan worden gebruikt, zonder de noodzaak van back-ticks zoals we moesten doen bij het gebruik van Mockito's native wanneer() methode.

Kijk op hun wiki voor een volledige lijst met verbeteringen.

5. Conclusie

In deze korte tutorial hebben we bekeken hoe we ons project kunnen opzetten om Mockito en Kotlin samen te gebruiken, en hoe we deze combinatie kunnen gebruiken om spot te maken en effectieve unit-tests te schrijven.

Zoals altijd kun je de volledige bron bekijken in de GitHub-opslagplaats.