Mockito Lanjutan: Penangkap Argumen dan Spy
Tangkap argumen kaedah dengan ArgumentCaptor dan olok sebahagian objek sebenar dengan Mockito.spy.
Mockito Lanjutan: Penangkap Argumen dan Spy ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
ArgumentCaptor: Menangkap Argumen Kaedah
ArgumentCaptor menangkap argumen yang dihantar kepada kaedah olokan supaya Anda boleh membuat penegasan terhadapnya. Ini berguna apabila argumen dibina dalam sistem yang sedang diuji dan Anda tidak dapat mengaksesnya secara langsung.
Mencipta dan Menggunakan ArgumentCaptor
Cipta captor untuk jenis argumen, hantar captor.capture() sebagai pemadan argumen dalam verify(), kemudian panggil captor.getValue() untuk mendapatkan 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 dengan @ExtendWith(MockitoExtension.class) untuk mengelakkan panggilan ArgumentCaptor.forClass() yang panjang.
@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 Berbilang Panggilan
Gunakan captor.getAllValues() apabila kaedah dipanggil berulang kali. Ia mengembalikan senarai semua nilai yang ditangkap mengikut susunan panggilan.
verify(emailService, times(3)).send(emailCaptor.capture());
List<EmailMessage> messages = emailCaptor.getAllValues();
assertEquals(3, messages.size());
assertEquals("Confirmation", messages.get(0).getSubject());Mock Separa dengan Mockito
Mockito.spy() membalut objek sebenar. Semua kaedah berfungsi seperti biasa melainkan Anda menetapkan gelagat gantinya secara jelas. Gunakannya apabila Anda perlu menguji kelas yang mempunyai beberapa kebergantungan yang sukar diuji tetapi kebanyakannya 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 dengan @ExtendWith(MockitoExtension.class) untuk mencipta spy. Medan tersebut mesti dimulakan sama ada sebaris atau melalui @Spy UserService svc = new UserService(repo);.
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Spy
OrderService orderService = new OrderService(mockRepo, mockEmail);
}Memerhati Bean Spring dengan @SpyBean
Dalam ujian Spring Boot, @SpyBean membalut objek Spring sedia ada dengan spy Mockito — tingkah laku sebenar dikekalkan melainkan digantikan. Ia berpasangan dengan @SpringBootTest.
@SpringBootTest
class IntegrationTest {
@SpyBean EmailService emailService;
@Test
void order_sends_email() {
orderService.placeOrder(cart);
verify(emailService).sendConfirmation(any());
}
}doReturn berbanding when().thenReturn() untuk Mock Separa
Untuk spy, gunakan doReturn(value).when(spy).method() dan bukannya when(spy.method()).thenReturn(value). Bentuk when(spy.method()) sebenarnya memanggil kaedah sebenar, yang mungkin menyebabkan kesan sampingan.
// 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!Mengesahkan Tiada Interaksi
Gunakan verifyNoInteractions(mock) untuk menegaskan bahawa olokan tidak pernah dipanggil, dan verifyNoMoreInteractions(mock) selepas semua panggilan yang dijangka untuk mengesan panggilan yang tidak dijangka.
verifyNoInteractions(emailService); // never called
verify(repo).save(any());
verifyNoMoreInteractions(repo); // save() was the only interactionPengesahan InOrder
Gunakan InOrder untuk menegaskan bahawa kaedah olokan dipanggil mengikut susunan tertentu.
InOrder inOrder = inOrder(repo, emailService);
inOrder.verify(repo).save(any());
inOrder.verify(emailService).send(any()); // save happened BEFORE sendPemadan Argumen
Gabungkan captor dengan pemadan: any(), eq(), anyString(), argThat(predicate). Jika mana-mana argumen menggunakan pemadan, semuanya mesti menggunakan pemadan.
verify(repo).save(argThat(user ->
user.getEmail().endsWith("@example.com") &&
user.getStatus() == UserStatus.ACTIVE));Semakan Pantas
Mengapa gunakan doReturn dan bukannya when().thenReturn() apabila menetapkan gelagat spy?
Rumusan
ArgumentCaptor menangkap argumen untuk dibuat penegasan selepas panggilan. Spy membalut objek sebenar dan menyerahkan pelaksanaan kepadanya melainkan gelagatnya digantikan. Gunakan doReturn untuk spy. Gunakan @SpyBean untuk ujian integrasi Spring. Sahkan susunan panggilan dengan InOrder.
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Mockito Lanjutan: Penangkap Argumen dan Spy” percuma?
Ya — teks penuh “Mockito Lanjutan: Penangkap Argumen dan Spy” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mockito Lanjutan: Penangkap Argumen dan Spy”?
Tangkap argumen kaedah dengan ArgumentCaptor dan olok sebahagian objek sebenar dengan Mockito.spy. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Mockito Lanjutan: Penangkap Argumen dan Spy” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Ujian Berparameter dengan @CsvSource dan @MethodSource
- Mockito Lanjutan: Penangkap Argumen dan Spy
- Slaid Ujian Spring Boot: @WebMvcTest dan @DataJpaTest
- Testcontainers: Ujian Integrasi Pangkalan Data Sebenar