Episode ini membahas testing di Quarkus: unit testing dengan JUnit 5, integration test dengan @QuarkusTest, mocking dan REST client testing, serta Testcontainers dan end-to-end testing.

Aplikasi tanpa test adalah bahaya laten: satu perubahan kecil bisa merusak fitur tanpa disadari sampai pengguna mengeluh. Quarkus memiliki dukungan testing kelas satu — mulai dari unit test biasa sampai integration test yang menjalankan aplikasi penuh.
Episode 17 membahas testing dan quality assurance di Quarkus: unit testing dengan JUnit 5, integration test dengan @QuarkusTest, mocking dan REST client testing, serta Testcontainers dan end-to-end testing.
Quarkus menyertakan dependency testing secara otomatis di project baru. Unit test plain JUnit 5 untuk service:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class GreetingServiceTest {
GreetingService service = new GreetingService();
@Test
void testSapa() {
assertEquals("Halo, Quarkus!", service.sapa("Quarkus"));
}
}Test ini murni unit: tidak menjalankan Quarkus, hanya menguji logika class. Cepat dan fokus.
./mvnw testPerintah ./mvnw test menjalankan semua test. Di project Quarkus, test secara otomatis berjalan dalam profile test.
@QuarkusTest menjalankan aplikasi Quarkus yang sebenarnya — CDI container aktif, endpoint tersedia, dan kalian bisa menguji secara end-to-end dalam JVM:
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.is;
@QuarkusTest
public class GreetingResourceTest {
@Test
void testHello() {
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(is("Halo Quarkus!"));
}
}Test ini memulai aplikasi nyata di port random, mengirim HTTP request dengan REST Assured, dan memverifikasi status serta body. @QuarkusTest adalah cara paling umum menguji endpoint di Quarkus.
Karena container aktif, kalian bisa @Inject bean langsung di test dan memverifikasinya dengan assertNotNull(service) — tanpa setup tambahan.
Untuk mengganti dependency di integration test, gunakan @InjectMock:
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static io.restassured.RestAssured.given;
@QuarkusTest
public class GreetingMockTest {
@InjectMock
GreetingService greetingService;
@Test
void testDenganMock() {
Mockito.when(greetingService.sapa("Quarkus"))
.thenReturn("Halo dari mock");
given().when().get("/hello")
.then().statusCode(200);
}
}@InjectMock mengganti bean GreetingService di container dengan mock. Ini sangat berguna untuk mengisolasi resource dari dependensi eksternal.
REST client (episode 14) juga bisa diuji: inject client dengan @RestClient, lalu panggil method-nya dan verifikasi hasilnya dengan assertEquals(...). Jika service eksternal tidak tersedia, mock client dengan @InjectMock dan @RestClient.
Untuk test yang melibatkan database, gunakan Testcontainers untuk menjalankan database nyata dalam container. Tambahkan dependency quarkus-test-h2 dengan scope test; untuk PostgreSQL gunakan quarkus-test-postgresql atau Testcontainers langsung dengan @QuarkusTestResource.
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
@QuarkusTest
@QuarkusTestResource(PostgresTestResource.class)
public class OrderRepositoryTest {
// test memakai PostgreSQL yang dijalankan di container
}@QuarkusTestResource mengaktifkan resource Testcontainers selama test. Database nyata memberi kepercayaan lebih tinggi daripada H2 in-memory untuk perilaku yang bergantung pada fitur database spesifik.
Untuk test yang lambat seperti native image, pisahkan dengan profile JUnit: tandai dengan @Tag("e2e") dan jalankan hanya test e2e dengan ./mvnw test -Dgroups=e2e di pipeline terpisah agar tidak memperlambat loop pengembangan harian.
Episode 17 membangun jaring pengaman kualitas kalian: unit testing dengan JUnit 5, integration test dengan @QuarkusTest yang menjalankan aplikasi nyata, mocking dengan @InjectMock dan testing REST client, serta Testcontainers dan end-to-end testing untuk kepercayaan penuh.
Inti yang harus dibawa pulang:
@QuarkusTest menjalankan aplikasi nyata untuk integration test.@InjectMock mengganti bean dengan mock di container test.@RestClient.Di episode 18 selanjutnya kita akan membahas architecture dan design patterns — modular architecture dengan feature-based organization, domain-driven design dan hexagonal architecture, event-driven architecture dengan reactive messaging, serta CQRS, event sourcing, dan publish/subscribe patterns.