Котлин с Мокито

1. Въведение

Котлин и Ява вървят ръка за ръка. Това означава, че можем да използваме огромния брой съществуващи Java библиотеки в нашите проекти на Kotlin.

В тази кратка статия ще видим как можем да се подиграваме с използването на Mockito в Kotlin. Ако искате да научите повече за библиотеката, проверете тази статия.

2. Настройка

Първо, нека създадем проект на Maven и добавим зависимости JUnit и Mockito в pom.xml:

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

Също така трябва да кажем на Maven, че работим с Kotlin, така че той да компилира изходния код за нас. Вижте официалната документация на Kotlin за повече информация как да конфигурирате това в pom.xml .

3. Използване на Mockito с Kotlin

Да предположим, че имаме реализация, която искаме да тестваме - LendBookManager . Този клас има зависимост от услуга, наречена BookService , която все още не е приложена:

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

В BookService се впръсква през инстанциирането на LendBookManager и се използва два пъти по време на касата метод, който е методът, който трябва да напишете нашия тест за:

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") } } } 

Би било трудно да се напишат модулни тестове за този метод, без да имаме възможност да се подиграваме на BookService - това е мястото, където Mockito е полезен.

Можем само с два реда код да създадем макет на интерфейса BookService и да му възложим да връща фиксирана стойност, когато се извика методът inStock () :

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

Това ще принуди екземпляра mockBookService да връща true, когато методът inStock () бъде извикан с аргумента 100 (забележете, че трябваше да избягаме от метода when () , използвайки обратния щрих; това се изисква, тъй като кога е запазена ключова дума в езика Kotlin ).

След това можем да предадем този подиграван екземпляр на LendBookManager по време на създаването на екземпляр, да извикаме метода, който искаме да тестваме, и да проверим дали методът lend () е бил извикан в резултат на операцията:

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

Можем бързо да тестваме другия логически път на изпълнението на нашия метод, който би трябвало да създаде изключение, ако желаната книга не е на склад:

@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) } 

Забелязахме, че за този тест казахме на mockBookService да върне false при запитване дали книгата с идентификатор 100 е на склад. Това би трябвало да предизвика извикването на checkout () да изхвърли IllegalStateException .

Използваме очакваното свойство в анотацията @Test , което показва, че очакваме този тест да създаде изключение.

4. Библиотека Mockito Kotlin

Можем да направим нашия код да изглежда по-подобен на Kotlin, като използваме библиотека с отворен код, наречена mockito-kotlin. Тази библиотека обгръща някои от функционалностите на Mockito около своите методи, предоставяйки по-опростен 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) }

Той също така предоставя своята версия на метода mock () . Когато използваме този метод, можем да използваме извода за тип, за да можем да извикаме метода, без да предаваме допълнителни параметри.

И накрая, тази библиотека излага нов метод when () , който може да се използва свободно, без да са необходими обратни отметки, както трябваше при използването на родния метод на Mockito когато () .

Проверете wiki за пълен списък с подобрения.

5. Заключение

В този бърз урок разгледахме как да настроим нашия проект да използва Mockito и Kotlin заедно и как можем да използваме тази комбинация, за да създадем макети и да напишем ефективни модулни тестове.

Както винаги, можете да проверите пълния източник в репозитория на GitHub.