Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest
Gunakan @WebMvcTest untuk menguji controller secara terisolasi dan @DataJpaTest untuk menguji lapisan repositori.
Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Apa Itu Irisan Pengujian?
Irisan pengujian hanya memuat bagian konteks Spring yang relevan untuk lapisan tertentu. Irisan ini lebih cepat daripada @SpringBootTest (yang memuat semuanya) dan mengisolasi lapisan yang diuji.
@WebMvcTest: Hanya Lapisan Pengontrol
@WebMvcTest(UserController.class) hanya memuat lapisan web: pengontrol, filter, konfigurasi keamanan, dan Jackson. Layanan serta repositori harus dibuat tiruannya dengan @MockBean.
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired MockMvc mockMvc;
@MockBean UserService userService;
@Test
void get_user_returns_200() throws Exception {
given(userService.findById(1L)).willReturn(new UserDto(1L, "Alice"));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Alice"));
}
}Membangun Permintaan MockMvc
Bangun permintaan dengan MockMvcRequestBuilders. Tetapkan header, jenis konten, dan isi permintaan untuk pengujian POST/PUT.
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":"Bob","email":"bob@example.com"}"""))
.andExpect(status().isCreated())
.andExpect(header().exists("Location"));Menguji Validasi dalam @WebMvcTest
Isi permintaan yang tidak valid memicu MethodArgumentNotValidException. Pastikan statusnya 400 dan isi respons kesalahannya sesuai.
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":"","email":"bad"}"""))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.errors.name").exists());@DataJpaTest: Hanya Lapisan Repositori
@DataJpaTest memuat repositori JPA, basis data H2 tertanam, Hibernate, dan TestEntityManager. Komponen lain seperti layanan dan web tidak dimuat.
@DataJpaTest
class UserRepositoryTest {
@Autowired UserRepository repo;
@Autowired TestEntityManager em;
@Test
void find_by_email() {
em.persist(new User("Alice", "alice@example.com"));
em.flush();
Optional<User> found = repo.findByEmail("alice@example.com");
assertTrue(found.isPresent());
}
}TestEntityManager
TestEntityManager membungkus EntityManager dengan metode praktis: persist(), flush(), find(), persistAndFlush().
User saved = em.persistAndFlush(new User("Bob", "bob@example.com"));
assertNotNull(saved.getId());
em.clear(); // detach all to force a real DB read
User fromDb = repo.findById(saved.getId()).orElseThrow();
assertEquals("Bob", fromDb.getName());Rollback @DataJpaTest
Setiap pengujian berjalan dalam transaksi yang dibatalkan setelah pengujian secara bawaan. Data tidak tersimpan di antara pengujian—memastikan isolasi pengujian tanpa pembersihan manual.
@DataJpaTest // each @Test is rolled back automatically
class OrderRepositoryTest {
@Test @Transactional
void count_orders_is_zero_by_default() {
assertEquals(0, orderRepo.count());
}
}Mengganti H2 dengan Basis Data Nyata dalam @DataJpaTest
Gunakan @AutoConfigureTestDatabase(replace = Replace.NONE) untuk menjalankan @DataJpaTest terhadap basis data nyata yang dikonfigurasi dalam application.properties, bukan H2.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest {
// Uses the configured PostgreSQL, not H2
}@JsonTest: Hanya Serialisasi JSON
@JsonTest memuat konfigurasi Jackson. Gunakan JacksonTester untuk memverifikasi bahwa objek diserialisasi dan dideserialisasi sesuai harapan.
@JsonTest
class UserDtoJsonTest {
@Autowired JacksonTester<UserDto> json;
@Test
void serializes_correctly() throws Exception {
UserDto dto = new UserDto(1L, "Alice", "alice@example.com");
assertThat(json.write(dto)).hasJsonPathStringValue("$.email");
}
}@RestClientTest: Lapisan Klien REST
@RestClientTest menguji klien HTTP berbasis RestTemplate atau WebClient. Anotasi ini mengonfigurasi MockRestServiceServer untuk menirukan respons HTTP.
@RestClientTest(WeatherClient.class)
class WeatherClientTest {
@Autowired WeatherClient client;
@Autowired MockRestServiceServer server;
@Test
void fetches_weather() {
server.expect(requestTo("/api/weather")).andRespond(withSuccess("""{"temp":22}""", APPLICATION_JSON));
Weather w = client.getWeather("Istanbul");
assertEquals(22, w.getTemp());
}
}Menggabungkan Irisan dengan @Import
Irisan mengecualikan banyak komponen berdasarkan desain. Gunakan @Import(SomeConfig.class) untuk menambahkan kelas konfigurasi tertentu yang diperlukan oleh irisan tersebut.
@WebMvcTest(UserController.class)
@Import(SecurityConfig.class) // load security for auth tests
class SecuredControllerTest { ... }Pemeriksaan Singkat
Apa yang digunakan @DataJpaTest sebagai basis data bawaan?
Rangkuman
@WebMvcTest menguji lapisan pengontrol dengan MockMvc; tirukan layanan menggunakan @MockBean. @DataJpaTest menguji repositori dengan TestEntityManager dan pembatalan transaksi otomatis. Gunakan Replace.NONE untuk basis data nyata. Gunakan @JsonTest untuk serialisasi dan @RestClientTest untuk klien HTTP.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest” gratis?
Ya — teks lengkap “Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest”?
Gunakan @WebMvcTest untuk menguji controller secara terisolasi dan @DataJpaTest untuk menguji lapisan repositori. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengujian Berparameter dengan @CsvSource dan @MethodSource
- Mockito Tingkat Lanjut: Penangkap Argumen dan Spy
- Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest
- Testcontainers: Pengujian Integrasi Basis Data Nyata