Перейти к основному содержимому

Тестирование на Kotlin

Разработчику Архитектору

Тестирование на Kotlin

На JVM для Kotlin используют JUnit 5 (совместим с Java) и Kotest (идиоматичный Kotlin). Для моков — MockK (удобнее Mockito для final и корутин).

См. также JUnit в Java.


JUnit 5 + MockK

build.gradle.kts:

dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
testImplementation("io.mockk:mockk:1.13.11")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1")
}
import io.mockk.*
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

interface UserRepo {
suspend fun findName(id: Int): String
}

class UserService(private val repo: UserRepo) {
suspend fun greet(id: Int) = "Hello, ${repo.findName(id)}!"
}

class UserServiceTest {

private val repo = mockk<UserRepo>()
private val service = UserService(repo)

@Test
fun greet() = runTest {
coEvery { repo.findName(1) } returns "Ann"
assertEquals("Hello, Ann!", service.greet(1))
coVerify { repo.findName(1) }
}
}

coEvery / coVerify — для suspend-функций.

./gradlew test

Kotest (кратко)

import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe

class CalculatorSpec : FunSpec({
test("add") {
Calculator().add(2, 3) shouldBe 5
}
})

Стили: DescribeSpec, BehaviorSpec (BDD). Property-based: forAll { a: Int, b: Int -> ... }.


Android

  • testImplementation — JVM unit-тесты (быстрые);
  • androidTestImplementation — на устройстве/эмуляторе;
  • runTest, TestDispatcher для корутин.

Ktor

@Test
fun health() = testApplication {
application { module() }
client.get("/health").apply {
status.value shouldBe 200
}
}

Зависимость: ktor-server-test-host.


Связанные материалы


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).