Kotlin med Mockito

1. Introduktion

Kotlin og Java går hånd i hånd. Dette betyder, at vi kan udnytte det store antal eksisterende Java-biblioteker i vores Kotlin-projekter.

I denne korte artikel vil vi se, hvordan vi kan spotte ved hjælp af Mockito i Kotlin. Hvis du vil lære mere om biblioteket, skal du tjekke denne artikel.

2. Opsætning

Lad os først og fremmest oprette et Maven-projekt og tilføje JUnit- og Mockito-afhængigheder i pom.xml:

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

Vi er også nødt til at fortælle Maven, at vi arbejder med Kotlin, så det kompilerer kildekoden til os. Se den officielle Kotlin-dokumentation for at få flere oplysninger om, hvordan du konfigurerer det i pom.xml.

3. Brug Mockito med Kotlin

Antag, vi har en implementering, vi vil teste - LendBookManager. Denne klasse er afhængig af en tjeneste, kaldet BookService, som endnu ikke er implementeret:

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

Det BookService injiceres under instantiering af LendBookManager og bruges to gange i hele kassen metode, som er den metode, vi har brug for til at skrive vores test for:

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

Det ville være svært at skrive enhedstest til denne metode uden at have evnen til at spotte BookService - hvilket er hvor Mockito kommer til nytte.

Vi kan med kun to linjer kode skabe en mock af BookService interface og instruere det om at returnere en fast værdi, når på lager() metoden kaldes:

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

Dette vil tvinge mockBookService eksempel for at vende tilbage rigtigt når som helst på lager() metoden kaldes med argumentet 100 (bemærk, at vi var nødt til at undslippe hvornår() metode ved hjælp af backtick; dette er påkrævet siden hvornår er et reserveret nøgleord på Kotlin-sproget).

Vi kan derefter videregive denne hånede instans til LendBookManager under instantiering skal du påberåbe den metode, vi vil teste, og kontrollere, at låne() metode blev kaldt som et resultat af operationen:

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

Vi kan hurtigt teste den anden logiske vej til implementeringen af ​​vores metode, hvilket burde give en undtagelse, hvis den ønskede bog ikke er på lager:

@Test (forventet = IllegalStateException :: klasse) sjovt, nårBookIsNotAvailable_thenAnExceptionIsThrown () {val mockBookService = Mockito.mock (BookService :: class.java) Mockito.`when` (mockBookService. InStock (100)). ThenReturn (false) val manager = LendBookManager (mockBookService) manager.checkout (100, 1)} 

Bemærket, at vi til denne test fortaltemockBookService at vende tilbage falsk når du bliver spurgt om bogen med id 100 var på lager. Dette skulle medføre, at kassen () påkaldelse til at kaste en IllegalStateException.

Vi bruger forventet ejendom på @Prøve kommentar, hvilket indikerer, at vi forventer, at denne test giver en undtagelse.

4. MockitoKotlin Bibliotek

Vi kan få vores kode til at se mere Kotlin-ud ved at bruge et open source-bibliotek kaldet mockito-kotlin. Dette bibliotek bryder nogle af Mockitos funktionalitet omkring dets metoder og giver en enklere API:

@Test sjov nårBookIsAvailable_thenLendMethodIsCalled () {val mockBookService: BookService = mock () når som helst (mockBookService.inStock (100)). Derefter Retur (sand) val manager = LendBookManager (mockBookService) manager. Checkout (100, 1) verificer (mockBookService) (100, 1)}

Det giver også sin version af mock () metode. Når vi bruger denne metode, kan vi udnytte typeinferens, så vi kan kalde metoden uden at overføre yderligere parametre.

Endelig dette biblioteket udsætter et nyt hver gang() metode, der kan bruges frit uden behov for back-flåter, som vi var nødt til, når vi brugte Mockitos oprindelige hvornår() metode.

Se deres wiki for en komplet liste over forbedringer.

5. Konklusion

I denne hurtige vejledning så vi, hvordan vi opsatte vores projekt til at bruge Mockito og Kotlin sammen, og hvordan vi kan udnytte denne kombination til at skabe mocks og skrive effektive enhedstests.

Som altid kan du tjekke den komplette kilde i GitHub-repoen.


$config[zx-auto] not found$config[zx-overlay] not found