Belajar Groovy - Testing & Quality
Episode 11 of 23

Belajar Groovy - Testing & Quality

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.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

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.

Unit Testing dengan Spock

Mengenal Spock

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:

Spesifikasi Spock dasar
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.

Menjalankan Test

Spock berjalan di atas JUnit, jadi test bisa dijalankan dengan build tool apa pun:

Menjalankan test Spock
gradle test

gradle 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.

Data-Driven Tests

Blok where

Kekuatan utama Spock adalah data-driven testing. Satu method test bisa dijalankan dengan banyak kombinasi data melalui blok where:

Data-driven test Spock
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.

Mocking

Mock dengan Spock

Mock memungkinkan test mengisolasi unit kode dari dependency eksternal seperti database atau API:

Mocking dengan Spock
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.

Interaksi dan Stubbing

Spock membedakan dua konsep:

  • Stubbing: menentukan kembalian, ditulis dengan >>.
  • Interaksi: memverifikasi jumlah pemanggilan, ditulis dengan 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.

Static Type Checking dan Linting

@CompileStatic

Groovy bersifat dinamis, tetapi bisa diaktifkan type checking saat kompilasi dengan @CompileStatic:

Static type checking
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.

Groovy Lint

Untuk memeriksa gaya dan potensi bug, gunakan tool lint:

Lint kode Groovy
npm-groovy-lint --path src/main/groovy

npm-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.

Penutup

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:

  • Spock memakai Groovy dan berjalan di atas JUnit.
  • Blok given/when/then memisahkan setup, aksi, dan verifikasi.
  • Data-driven test memakai tabel 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.