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.

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.
JUnit 5 adalah standar framework testing Java. Tambahkan dependency:
mvn dependency:get -Dartifact=org.junit.jupiter:junit-jupiter:5.10.3Struktur test: class di src/test/java, method dengan anotasi @Test dan assertion:
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.
Jalankan dengan Maven:
mvn testmvn test menjalankan semua test di src/test/java dan melaporkan hasilnya.
Mocking mensimulasikan dependensi eksternal (database, API) sehingga unit test fokus pada logika saja. Mockito adalah library mocking paling populer:
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.
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 test memverifikasi kerja sama antar komponen: aplikasi dengan database, message broker, atau layanan eksternal. Test ini memakai environment nyata, bukan mock.
Testcontainers menjalankan dependensi nyata (database, broker) di dalam Docker saat test berjalan:
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 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 memeriksa kode tanpa menjalankannya:
Tambahkan sebagai plugin Maven:
<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:
mvn verifymvn verify menjalankan test dan static analysis secara bersamaan, menjadikannya quality gate otomatis.
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:
@Test dan assertion adalah dasar unit testing.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!