Testen in Kotlin: vollständiger Überblick über Frameworks und Werkzeuge
Kotlin — eine Sprache, die rasant an Popularität in der Backend-Entwicklung (Spring Boot, Ktor) und Android gewinnt. Eine leistungsstarke Sprache erfordert jedoch angemessene Testwerkzeuge. In diesem Artikel analysieren wir die wichtigsten Frameworks und Bibliotheken zum Testen von Kotlin-Anwendungen: vom klassischen JUnit5 bis zu modernen Kotest und MockK. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler nützlich, die von Java wechseln.
1. JUnit5 — die Grundlage des modernen Testens
JUnit5 (Jupiter) ist der De-facto-Standard für Modultests in Java/Kotlin. In Kotlin wird es mit kleinen, aber wichtigen Besonderheiten verwendet.
- Unterstützung von Lambdas und Funktionen höherer Ordnung — Tests können prägnanter geschrieben werden.
- Annotationen —
@Test,@BeforeEach,@AfterAllfunktionieren wie in Java. - Assumptions und Assertions — integrierte Überprüfungen.
Beispiel eines einfachen Tests mit JUnit5 und Kotlin:
import org.junit.jupiter.api.Assertions.assertEqualsimport org.junit.jupiter.api.Test
class CalculatorTest {
private val calculator = Calculator()
@Test fun `addition of two numbers should return correct sum`() { val result = calculator.add(2, 3) assertEquals(5, result) }
@Test fun `should throw exception when dividing by zero`() { assertThrows<IllegalArgumentException> { calculator.divide(10, 0) } }}Wichtig: Kotlin erlaubt die Verwendung von Leerzeichen in Namen von Testfunktionen (Backticks), was die Testnamen in natürlicher Sprache lesbar macht.
2. Kotest — natives Kotlin-Framework
Kotest (früher KotlinTest) ist das umfassendste und flexibelste Framework, das vollständig in Kotlin geschrieben ist. Es bietet mehrere Stile zum Schreiben von Tests (String Spec, Specification, Behavior) und leistungsstarke integrierte Matcher.
Wichtige Funktionen:
- Property-based Testing — automatische Generierung von Testdaten.
- Data-driven Tests — mit Tabellen von Eingabedaten.
- Leistungsstarke Assertion-Matcher —
shouldBe,shouldContain,shouldThrowu.a. - Unterstützung von Coroutines — integrierter
testCoroutineScope.
Beispiel eines Tests im "String Spec"-Stil:
import io.kotest.core.spec.style.StringSpecimport io.kotest.matchers.shouldBeimport io.kotest.matchers.shouldThrow
class UserServiceTest : StringSpec({
val service = UserService()
"should return user by id" { val user = service.getUser(1) user.name shouldBe "Alice" }
"should throw exception for invalid id" { shouldThrow<NoSuchElementException> { service.getUser(-1) } }})Property-based Testing in Kotest:
import io.kotest.property.forAllimport io.kotest.property.arbitrary.int
class MathPropertiesTest : StringSpec({ "addition is commutative" { forAll<Int, Int> { a, b -> (a + b) == (b + a) } }})3. MockK — Mocks für Kotlin
Im Gegensatz zu Mockito (das ebenfalls verwendet werden kann) ist MockK vollständig an die Besonderheiten von Kotlin angepasst: Es unterstützt sealed classes, object, extension functions und coroutines.
Hauptfunktionen:
- Prägnantes DSL zum Erstellen von Mocks und Stubs.
- Unterstützung von Relax-Mocks (nicht verifizierte Aufrufe).
- Verifizierung der Aufrufreihenfolge und der Anzahl der Aufrufe.
- Mocks für
suspend-Funktionen.
Auch in der Bibliothek
Caching in Rust: Die Bibliothek `cached`
AssertJ für Java: Das komplette Guide mit Beispielen
Arbeiten mit CSV in Swift (iOS/macOS): Die Bibliothek SwiftCSV und Grundlagen des Parsings
TypeBox für TypeScript: Komplettguide mit Praxisbeispielen
PDF-Generierung in Go: Überblick über Bibliotheken und praktische Anleitung