Mockito Tingkat Lanjut: Penangkap Argumen dan Spy
Tangkap argumen metode dengan ArgumentCaptor dan lakukan mock sebagian pada objek nyata dengan Mockito.spy.
Mockito Tingkat Lanjut: Penangkap Argumen dan Spy adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
ArgumentCaptor: Menangkap Argumen Metode
ArgumentCaptor menangkap argumen yang diteruskan ke metode tiruan sehingga Anda dapat memeriksanya. Ini berguna saat argumen dibuat di dalam sistem yang diuji dan tidak dapat Anda akses secara langsung.
Membuat dan Menggunakan ArgumentCaptor
Buat penangkap untuk tipe argumen, teruskan captor.capture() sebagai pencocok argumen dalam verify(), lalu panggil captor.getValue() untuk memperoleh argumen yang ditangkap.
@Test
void sends_correct_email() {
ArgumentCaptor<EmailMessage> captor = ArgumentCaptor.forClass(EmailMessage.class);
userService.register(new CreateUserRequest("alice@example.com"));
verify(emailService).send(captor.capture());
EmailMessage msg = captor.getValue();
assertEquals("alice@example.com", msg.getTo());
assertTrue(msg.getSubject().contains("Welcome"));
}Anotasi @Captor
Gunakan @Captor bersama @ExtendWith(MockitoExtension.class) untuk menghindari pemanggilan ArgumentCaptor.forClass() yang bertele-tele.
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock EmailService emailService;
@Captor ArgumentCaptor<EmailMessage> emailCaptor;
@Test
void captures_email() {
// ...
verify(emailService).send(emailCaptor.capture());
assertEquals("Welcome!", emailCaptor.getValue().getSubject());
}
}Menangkap Beberapa Pemanggilan
Gunakan captor.getAllValues() saat metode dipanggil beberapa kali. Ini mengembalikan daftar semua nilai yang ditangkap sesuai urutan pemanggilan.
verify(emailService, times(3)).send(emailCaptor.capture());
List<EmailMessage> messages = emailCaptor.getAllValues();
assertEquals(3, messages.size());
assertEquals("Confirmation", messages.get(0).getSubject());Spy Mockito: Tiruan Sebagian
Mockito.spy() membungkus objek nyata. Semua metode berperilaku normal kecuali Anda secara eksplisit menetapkan perilaku pengganti. Gunakan saat Anda perlu menguji kelas yang memiliki beberapa dependensi yang sulit diuji, tetapi sebagian besar berfungsi dengan baik.
List<String> realList = new ArrayList<>();
List<String> spy = Mockito.spy(realList);
spy.add("hello"); // calls real ArrayList.add()
System.out.println(spy.size()); // 1 — real method called
doReturn(42).when(spy).size(); // stub just size()
System.out.println(spy.size()); // 42 — stubbedAnotasi @Spy
Gunakan @Spy bersama @ExtendWith(MockitoExtension.class) untuk membuat objek pengintai. Bidang tersebut harus diinisialisasi, baik secara langsung maupun melalui @Spy UserService svc = new UserService(repo);.
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Spy
OrderService orderService = new OrderService(mockRepo, mockEmail);
}Memata-matai Komponen Spring dengan @SpyBean
Dalam pengujian Spring Boot, @SpyBean membungkus komponen Spring yang sudah ada dalam objek pengintai Mockito—perilaku nyata tetap digunakan kecuali diganti. Anotasi ini dipadukan dengan @SpringBootTest.
@SpringBootTest
class IntegrationTest {
@SpyBean EmailService emailService;
@Test
void order_sends_email() {
orderService.placeOrder(cart);
verify(emailService).sendConfirmation(any());
}
}doReturn vs when().thenReturn() untuk Objek Pengintai
Untuk objek pengintai, gunakan doReturn(value).when(spy).method(), bukan when(spy.method()).thenReturn(value). Bentuk when(spy.method()) benar-benar memanggil metode nyata, yang dapat menimbulkan efek samping.
// Correct for spies:
doReturn(List.of()).when(spy).findAll();
// WRONG for spies — calls real findAll() first:
when(spy.findAll()).thenReturn(List.of()); // real method called!Memverifikasi Tidak Ada Interaksi
Gunakan verifyNoInteractions(mock) untuk memastikan tiruan tidak pernah dipanggil, dan verifyNoMoreInteractions(mock) setelah semua pemanggilan yang diharapkan untuk mendeteksi pemanggilan yang tidak semestinya.
verifyNoInteractions(emailService); // never called
verify(repo).save(any());
verifyNoMoreInteractions(repo); // save() was the only interactionVerifikasi Urutan Pemanggilan
Gunakan InOrder untuk memastikan bahwa metode tiruan dipanggil dalam urutan tertentu.
InOrder inOrder = inOrder(repo, emailService);
inOrder.verify(repo).save(any());
inOrder.verify(emailService).send(any()); // save happened BEFORE sendPencocok Argumen
Gabungkan penangkap dengan pencocok: any(), eq(), anyString(), argThat(predicate). Jika satu argumen menggunakan pencocok, semua argumen harus menggunakannya.
verify(repo).save(argThat(user ->
user.getEmail().endsWith("@example.com") &&
user.getStatus() == UserStatus.ACTIVE));Pemeriksaan Singkat
Mengapa menggunakan doReturn alih-alih when().thenReturn() saat menetapkan perilaku pengganti untuk objek pengintai?
Rangkuman
ArgumentCaptor menangkap argumen untuk diperiksa setelah pemanggilan. Objek pengintai membungkus objek nyata dan meneruskan pemanggilan kecuali perilakunya diganti. Gunakan doReturn untuk objek pengintai. Gunakan @SpyBean untuk pengujian integrasi Spring. Verifikasi urutan pemanggilan dengan InOrder.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mockito Tingkat Lanjut: Penangkap Argumen dan Spy” gratis?
Ya — teks lengkap “Mockito Tingkat Lanjut: Penangkap Argumen dan Spy” 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 “Mockito Tingkat Lanjut: Penangkap Argumen dan Spy”?
Tangkap argumen metode dengan ArgumentCaptor dan lakukan mock sebagian pada objek nyata dengan Mockito.spy. 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 2 dari 4.
Berapa lama pelajaran “Mockito Tingkat Lanjut: Penangkap Argumen dan Spy” 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