Тестирование в Kotlin: фреймворки и инструменты для качественного кода
Kotlin — современный язык программирования, работающий поверх JVM. Благодаря совместимости с Java, для тестирования Kotlin-кода можно использовать классические Java-фреймворки (JUnit, Mockito), а также современные инструменты, написанные специально под Kotlin. В этой статье разберём основные фреймворки, их особенности и приведём практические примеры.
1. JUnit 5 — основа тестирования
JUnit 5 — стандартный фреймворк для модульного тестирования на JVM. Отлично работает с Kotlin благодаря поддержке лямбд, extension-функций и data-классов.
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*
class CalculatorTest {
@Test
fun `addition should return correct sum`() {
val result = Calculator().add(2, 3)
assertEquals(5, result)
}
}
Особенности JUnit 5 в Kotlin:
- Имена тестов можно писать в бэктиках с пробелами — читаемость повышается
- Поддержка параметризованных тестов через
@ParameterizedTest - Встроенные assertion-функции (assertAll, assertThrows)
- Легко комбинируется с MockK и Mockito
2. Kotest — фреймворк нового поколения
Kotest (бывший KotlinTest) — мощный фреймворк, написанный на Kotlin с нуля. Предлагает множество стилей описания тестов (StringSpec, BehaviorSpec, FunSpec и другие).
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
class StringSpecExample : StringSpec({
"length should return correct size" {
"hello".length shouldBe 5
}
"startsWith should work" {
"world".startsWith("wo") shouldBe true
}
})
Преимущества Kotest:
- Более 200 встроенных matcher-ов (shouldBe, shouldContain, shouldBeGreaterThan)
- Поддержка property-based testing (генерация случайных данных)
- Встроенные дата-провайдеры для табличных тестов
- Полная интеграция с Gradle и Maven
3. MockK — моки для Kotlin
MockK — библиотека для создания мок-объектов, специально спроектированная для Kotlin. Учитывает null-safety, корутины и extension-функции.
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.jupiter.api.Test
class UserServiceTest {
@Test
fun `should call repository`() {
val repo = mockk<UserRepository>()
every { repo.findUser(1) } returns User("Alice")
val service = UserService(repo)
service.getUserName(1)
verify { repo.findUser(1) }
}
}
Ключевые возможности MockK:
- Поддержка
spy(частичное мокирование) - Работа с suspend-функциями и корутинами (
coEvery,coVerify) - Удобные matcher-ы для аргументов (
any(),capture()) - Автоматическое зануление моков после теста
4. Spek — BDD-стиль тестирования
Spek — фреймворк для Behaviour-Driven Development. Позволяет описывать тесты в формате «Given-When-Then».
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe
class CalculatorSpek : Spek({
describe("Calculator") {
val calc by memoized { Calculator() }
context("addition") {
it("returns sum of two numbers") {
val result = calc.add(2, 3)
assertEquals(5, result)
}
}
}
})
Особенности Spek:
- Читаемая структура тестов для бизнес-спецификаций
- Поддержка вложенных контекстов и глобальных фикстур
- Интеграция с JUnit Platform (запуск через Gradle)
- Работает с Kotlin Multiplatform
5. Дополнительные инструменты
Mockito — классический Java-фреймворк, который также работает с Kotlin. Для лучшей совместимости используйте mockito-kotlin — обёртку с Kotlin-extension функциями.
Ktor Client Mock — утилита для тестирования
Также в библиотеке
ts-mockito для TypeScript: полное руководство с примерами
Отправка email на JavaScript (Node.js): nodemailer, sendgrid, mailgun
Respect/Validation для PHP: полное руководство с примерами
Event Bus и паттерн Observer в TypeScript: реализация и примеры