Episode ini menguasai pengujian dan kualitas kode Kotlin: unit testing dengan Kotlin Test, JUnit 5, dan Kotest, mocking dengan MockK atau Mockito, pola Behavior-Driven Testing, serta continuous testing dan otomatisasi yang menjaga kepercayaan terhadap kode.

Kode yang tidak diuji hanyalah spekulasi. Episode 13 membekali kalian keterampilan testing dan quality di Kotlin: unit testing dengan framework standar, mocking dependency, pola Behavior-Driven Testing, dan otomatisasi yang menjalankan test terus-menerus.
Ekosistem test Kotlin kaya: JUnit 5 sebagai fondasi, Kotlin Test yang memadukan assertions idiomatis, dan Kotest yang menawarkan gaya BDD dan property-based testing. MockK dirancang khusus untuk Kotlin dengan dukungan coroutines.
Setelah episode ini, kalian akan menulis test yang memberikan kepercayaan — bukan sekadar mengejar coverage.
JUnit 5 adalah standar de facto test JVM. Dengan Kotlin, anotasi @Test dipakai langsung pada fungsi test:
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
class KalkulatorTest {
private val kalkulator = Kalkulator()
@Test
fun menambahkanDuaAngka() {
assertEquals(7, kalkulator.tambah(3, 4))
}
}Nama fungsi test bisa memakai spasi bila dibungkus backtick, menghasilkan nama yang membaca seperti kalimat. assertEquals adalah assertion Kotlin Test yang menyatu dengan framework JUnit dan membungkus failure dengan pesan yang informatif.
Kotest menawarkan beberapa style spec dan property-based testing. Gaya StringSpec menulis test sebagai deskripsi dan lambda:
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
class GajiTest : StringSpec({
"gaji bersih mengurangi pajak" {
gajiBersih(10_000_000) shouldBe 8_500_000
}
})shouldBe adalah matcher yang terbaca alami. Kotest juga punya forAll untuk property-based testing: kalian mendefinisikan properti yang harus selalu benar, dan Kotest membangkitkan banyak input untuk mengujinya secara otomatis.
MockK adalah library mocking yang memahami Kotlin: mendukung final classes, coroutines, dan extension functions — hal yang sulit dilakukan dengan framework Java lama. Membuat mock dan memverifikasi interaksi:
import io.mockk.*
import kotlin.test.assertTrue
class PesanServiceTest {
private val repo = mockk<PesanRepository>()
private val service = PesanService(repo)
@Test
fun simpanMemanggilRepository() {
every { repo.simpan(any()) } returns true
val hasil = service.kirim("halo")
verify { repo.simpan("halo") }
assertTrue(hasil)
}
}mockk<PesanRepository>() membuat mock tanpa class asli. every { ... } returns ... mendefinisikan perilaku, dan verify { ... } memastikan interaksi benar-benar terjadi. MockK juga menyediakan coEvery dan coVerify khusus untuk fungsi suspend.
Mockito tetap banyak dipakai, terutama di codebase yang sudah berbasis Java. Dengan modul inline mock maker, Mockito bisa mem-mock final class dan fungsi Kotlin. Keunggulan Mockito adalah ekosistem dan dokumentasi yang luas; keunggulan MockK adalah dukungan native untuk fitur Kotlin seperti data class, coroutines, dan object companion.
Behavior-Driven Testing menekankan perilaku sistem dari perspektif pengguna, bukan detail implementasi. Kotest mendukung gaya ini dengan FunSpec atau DescribeSpec:
import io.kotest.core.spec.style.DescribeSpec
class KeranjangTest : DescribeSpec({
describe("keranjang belanja") {
it("menghitung total") {
val keranjang = Keranjang()
keranjang.tambah("kopi", 15000)
keranjang.tambah("teh", 8000)
keranjang.total() shouldBe 23000
}
}
})Struktur describe dan it membuat test membaca seperti spesifikasi fitur. Nama-nama ini muncul di laporan test, sehingga siapa pun bisa memahami apa yang dijamin tanpa membaca implementasi.
Prinsip TDD yang menyertai BDD: tulis test yang gagal dulu, buat lulus seminimal mungkin, lalu refactor. Siklus ini menjaga test tetap fokus pada perilaku dan mencegah test yang "tutup mata" karena menjiplak implementasi.
Seluruh test project dijalankan dengan satu perintah Gradle:
./gradlew test
./gradlew test --tests "id.devnull.KalkulatorTest"./gradlew test menjalankan semua test di project, dan --tests memfilter test tertentu. Gradle mem-parallel-kan eksekusi test dan menyimpan laporan di build/reports/tests.
Untuk menjaga kualitas, jalankan test di setiap perubahan kode. Pola pipeline yang umum:
steps:
- uses: actions/setup-java
with:
distribution: temurin
java-version: "21"
- run: ./gradlew testBlok YAML di atas menjalankan test dengan JDK Temurin 21 di GitHub Actions. Otomatisasi ini membuat kualitas terjaga terus-menerus — setiap pull request yang merusak test langsung terdeteksi sebelum merger. Episode 19 akan membahas pipeline lengkap dengan deployment.
Episode 13 membekali kalian testing dan quality di Kotlin: unit test dengan JUnit 5 dan Kotest, mocking dengan MockK atau Mockito, pola BDD yang berpusat pada perilaku, serta continuous testing lewat Gradle dan pipeline CI.
Inti yang harus dibawa pulang:
./gradlew test menjalankan seluruh suite dan menghasilkan laporan.Di episode 14 selanjutnya kita akan membahas build tools dan project configuration — Gradle Kotlin DSL dan build scripts, dependency management dengan source sets dan plugins, multi-module projects dan build performance, serta publishing artifacts dan versioning.