Java Academy · Pelajaran

Mockito Lanjutan: Penangkap Argumen dan Spy

Tangkap argumen kaedah dengan ArgumentCaptor dan olok sebahagian objek sebenar dengan Mockito.spy.

Pelajaran 2 daripada 413 langkah

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 — stubbed

Anotasi @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 interaction

Pengesahan 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 send

Pemadan 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.

Percuma untuk bermula

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

  1. Ujian Berparameter dengan @CsvSource dan @MethodSource
  2. Mockito Lanjutan: Penangkap Argumen dan Spy
  3. Slaid Ujian Spring Boot: @WebMvcTest dan @DataJpaTest
  4. Testcontainers: Ujian Integrasi Pangkalan Data Sebenar
← Kembali ke Java Academy