Episode ini membahas unit testing dengan Spock dan JUnit, termasuk mocking, data-driven tests, dan behavior-driven syntax. Kalian juga akan belajar static type checking dan linting untuk menjaga kualitas kode Groovy sejak dari editor.

Kode tanpa test adalah utang teknis yang menumpuk diam-diam. Episode 11 membawa kalian ke praktik pengujian di ekosistem Groovy, dengan fokus pada Spock — framework testing yang lahir untuk Groovy dan menjadi standar de facto di project JVM.
Kalian akan belajar unit testing dengan Spock dan JUnit, mocking, data-driven tests, behavior-driven syntax, serta static type checking dan linting untuk menjaga kualitas kode.
Spock memakai Groovy sebagai bahasa test, sehingga test ditulis dalam file .groovy. Struktur dasar Spock terdiri dari blok given, when, dan then yang memisahkan setup, aksi, dan verifikasi:
import spock.lang.Specification
class KalkulatorSpec extends Specification {
def "menjumlahkan dua angka"() {
given:
def kalkulator = new Kalkulator()
when:
def hasil = kalkulator.tambah(2, 3)
then:
hasil == 5
}
}class KalkulatorSpec extends Specification menjadikan class sebagai test Spock. def "menjumlahkan dua angka"() adalah nama method test yang bisa berupa kalimat lengkap — itulah ciri behavior-driven syntax.
Spock berjalan di atas JUnit, jadi test bisa dijalankan dengan build tool apa pun:
gradle testgradle test menjalankan seluruh test di project, termasuk Spock spec dan test JUnit. Hasilnya berupa laporan HTML dan XML yang bisa diintegrasikan ke pipeline CI/CD — topik yang akan kita dalami di episode 13.
Kekuatan utama Spock adalah data-driven testing. Satu method test bisa dijalankan dengan banyak kombinasi data melalui blok where:
import spock.lang.Specification
class KalkulatorSpec extends Specification {
def "penjumlahan dengan berbagai input"() {
expect:
a + b == hasil
where:
a | b || hasil
1 | 2 || 3
5 | 5 || 10
-1 | 1 || 0
}
}where: menyediakan tabel data dengan || memisahkan input dari ekspektasi. a | b || hasil mendefinisikan header kolom, dan setiap baris berikutnya adalah satu kasus test. Jika satu baris gagal, Spock melaporkan baris mana yang bermasalah.
Mock memungkinkan test mengisolasi unit kode dari dependency eksternal seperti database atau API:
import spock.lang.Specification
class LayananSpec extends Specification {
def "mengambil data dari repository mock"() {
given:
def repo = Mock(Repositori)
def layanan = new Layanan(repo)
repo.cari(1) >> "data-1"
when:
def hasil = layanan.ambil(1)
then:
hasil == "data-1"
1 * repo.cari(1)
}
}Mock(Repositori) membuat objek tiruan, dan repo.cari(1) >> "data-1" mengatur kembalian. 1 * repo.cari(1) adalah verifikasi interaksi — memastikan method dipanggil tepat satu kali dengan argumen tertentu.
Spock membedakan dua konsep:
>>.1 *.Keduanya bisa digabung dalam satu ekspresi. Pola ini membuat test Spock mengekspresikan intent dengan jelas, sesuatu yang di JUnit membutuhkan library tambahan seperti Mockito.
Groovy bersifat dinamis, tetapi bisa diaktifkan type checking saat kompilasi dengan @CompileStatic:
import groovy.transform.CompileStatic
@CompileStatic
class Layanan {
String sapa(String nama) {
"Halo, ${nama}!"
}
}@CompileStatic membuat kompiler Groovy memeriksa tipe seperti Java. import groovy.transform.CompileStatic mempercepat eksekusi sekaligus menangkap error tipe sejak kompilasi — trade-off performa akan kita bahas di episode 16.
Untuk memeriksa gaya dan potensi bug, gunakan tool lint:
npm-groovy-lint --path src/main/groovynpm-groovy-lint --path src/main/groovy menjalankan pemeriksa berbasis CodeNarc yang mendeteksi code smell dan violation gaya. Integrasikan lint ke CI agar setiap pull request melewati pemeriksaan otomatis.
Episode 11 membekali kalian fondasi testing Groovy: Spock dengan blok given/when/then, data-driven test dengan where, mocking dan verifikasi interaksi, serta static type checking dan linting untuk kualitas kode.
Inti yang harus dibawa pulang:
given/when/then memisahkan setup, aksi, dan verifikasi.where dengan banyak kasus.Mock menciptakan objek tiruan; >> mengatur kembalian.1 * method memverifikasi jumlah interaksi.@CompileStatic menambah type safety dan kecepatan eksekusi.Di episode 12 selanjutnya kita akan membahas Gradle dan build automation — build script Groovy di build.gradle, task custom, plugin, dependency management, dan multi-module projects.