Belajar Java - Testing & Quality Assurance
Series/Belajar Java/Episode 17
Episode 17 of 24

Belajar Java - Testing & Quality Assurance

Episode ini membahas testing di Java: unit testing dengan JUnit 5, mocking dengan Mockito dan pendekatan test-driven development, integration testing, contract testing, dan test containers, serta static analysis dan tooling linting dengan SpotBugs, Checkstyle, dan PMD.

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

Pendahuluan

Kode tanpa test adalah kode yang dianggap rusak. Episode 17 membahas testing dan quality assurance di Java — dari unit testing dengan JUnit 5, mocking dengan Mockito, hingga integration testing, contract testing, dan static analysis. Kalian akan membangun jaring pengaman yang membuat refactoring menjadi aman.

Testing bukan formalitas; ia budaya. Episode ini memperkenalkan alat dan pola yang dipakai tim profesional untuk menjaga kualitas kode secara berkelanjutan.

Unit Testing dengan JUnit 5

Menambahkan JUnit 5

JUnit 5 adalah standar framework testing Java. Tambahkan dependency:

Menambahkan JUnit 5
mvn dependency:get -Dartifact=org.junit.jupiter:junit-jupiter:5.10.3

Struktur test: class di src/test/java, method dengan anotasi @Test dan assertion:

Unit test dengan JUnit 5
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
 
class KalkulatorTest {
 
    @Test
    void tambahMenghasilkanJumlah() {
        Kalkulator kalkulator = new Kalkulator();
        assertEquals(5, kalkulator.tambah(2, 3));
    }
 
    @Test
    void bagiDenganNolMelemparException() {
        Kalkulator kalkulator = new Kalkulator();
        assertThrows(ArithmeticException.class,
            () -> kalkulator.bagi(10, 0));
    }
}

assertEquals(5, kalkulator.tambah(2, 3)) memverifikasi hasil yang diharapkan. Assertion lain: assertTrue, assertNull, dan assertThrows.

Menjalankan Test

Jalankan dengan Maven:

Menjalankan unit test
mvn test

mvn test menjalankan semua test di src/test/java dan melaporkan hasilnya.

Mocking dengan Mockito dan Pendekatan TDD

Mengapa Mocking

Mocking mensimulasikan dependensi eksternal (database, API) sehingga unit test fokus pada logika saja. Mockito adalah library mocking paling populer:

Mocking dengan Mockito
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
 
class LayananTest {
 
    @Test
    void ambilDataMemakaiRepository() {
        Repositori repo = mock(Repositori.class);
        when(repo.cari(1L)).thenReturn("Data");
 
        Layanan layanan = new Layanan(repo);
        assertEquals("Data", layanan.ambil(1L));
        verify(repo).cari(1L);
    }
}

mock(Repositori.class) membuat objek tiruan, when(...).thenReturn(...) menentukan perilakunya, dan verify memastikan method dipanggil.

Test-Driven Development

TDD bekerja dalam siklus singkat: tulis test yang gagal, buat implementasi minimal agar test lulus, lalu refactor. Siklus red-green-refactor ini memaksa kalian berpikir tentang spesifikasi sebelum implementasi.

Integration Testing, Contract Testing, dan Test Containers

Integration Testing

Integration test memverifikasi kerja sama antar komponen: aplikasi dengan database, message broker, atau layanan eksternal. Test ini memakai environment nyata, bukan mock.

Test Containers

Testcontainers menjalankan dependensi nyata (database, broker) di dalam Docker saat test berjalan:

Testcontainers dengan PostgreSQL
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.*;
 
@Testcontainers
class IntegrationTest {
 
    @Container
    static PostgreSQLContainer<?> postgres =
        new PostgreSQLContainer<>("postgres:16");
 
    @Test
    void koneksiKeDatabaseNyata() {
        String url = postgres.getJdbcUrl();
        assertNotNull(url);
    }
}

new PostgreSQLContainer<>("postgres:16") memulai PostgreSQL asli di Docker untuk test yang realistis.

Contract Testing

Contract testing memverifikasi bahwa dua layanan yang berkomunikasi sepakat pada kontrak API yang sama — mencegah integrasi yang rusak diam-diam. Alat populer: Spring Cloud Contract dan Pact.

Static Analysis dan Tooling Linting

SpotBugs, Checkstyle, dan PMD

Static analysis memeriksa kode tanpa menjalankannya:

  • SpotBugs: mendeteksi bug nyata melalui analisis bytecode.
  • Checkstyle: memeriksa gaya dan konvensi kode.
  • PMD: mendeteksi kode bermasalah dan code smell.

Tambahkan sebagai plugin Maven:

Plugin Maven untuk static analysis
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
      <version>3.4.0</version>
    </plugin>
    <plugin>
      <groupId>com.github.spotbugs</groupId>
      <artifactId>spotbugs-maven-plugin</artifactId>
      <version>4.8.6</version>
    </plugin>
  </plugins>
</build>

Jalankan saat build:

Menjalankan static analysis
mvn verify

mvn verify menjalankan test dan static analysis secara bersamaan, menjadikannya quality gate otomatis.

Penutup

Episode 17 membahas testing dan QA: unit testing dengan JUnit 5, mocking dengan Mockito dan pendekatan TDD, integration testing, contract testing, dan test containers, serta static analysis dengan SpotBugs, Checkstyle, dan PMD.

Inti yang harus dibawa pulang:

  • JUnit 5 dengan @Test dan assertion adalah dasar unit testing.
  • Mockito mensimulasikan dependensi eksternal dalam test.
  • TDD mengikuti siklus red-green-refactor.
  • Testcontainers menjalankan dependensi nyata di Docker.
  • Contract testing mencegah integrasi rusak antar layanan.
  • SpotBugs, Checkstyle, dan PMD menjadi quality gate otomatis.

Di episode 18 selanjutnya kita akan membahas modular programming dan project architecture — Java Platform Module System modern, modularisasi aplikasi dengan module-info.java dan dependency encapsulation, clean architecture, package-by-feature, dan arsitektur layered, serta pola desain penting builder, factory, strategy, dan observer. Saatnya merancang arsitektur yang bersih!

Belajar Java - Testing & Quality Assurance | Belajar Java