Adakah yang bisa memberi saya contoh yang menunjukkan cara menggunakan org.mockito.ArgumentCaptor
kelas dan perbedaannya dari pencocokan sederhana yang disediakan dengan mockito.
Saya membaca dokumen mockito yang disediakan tetapi itu tidak menggambarkannya dengan jelas, tidak ada yang bisa menjelaskannya dengan jelas.
java
unit-testing
junit
mockito
Ujjwal
sumber
sumber
doSomething(data)
bermutasiinnerData
, apakah perubahan itu akan adaassertEquals("Some inner data", actual.innerData)
, atau akaninnerData
ditangkap apa adanya sebelumdoSomething
dieksekusi?OtherClass
adalah tiruan, dan seperti yang didefinisikan sekarang,doSomething()
sebenarnya tidak akan melakukan apa pun, itu hanya merekam objek yang telah lewat. Artinya akan ditangkap apa adanya sebelumdoSomething
dieksekusi.verify
,times(1)
adalah default dan dapat dihilangkan.verify
metode, ia menggunakan informasi itu untuk menjalankan kecocokan terhadap verifikasi yang Anda lakukan. Untuk setiap parameter ia menanyakan apakah cocok dengan panggilan spesifik yang diperiksa. Saat ArgumentCaptor dicentang, ia hanya menyimpan nilai yang dipanggil dengannya sehingga saatverify
diakhiri, ia menampung semua pemanggilan yang relevan. Ini kira-kira cara kerjanya. Semoga membantuDua perbedaan utama adalah:
ArgumentCaptor
kaleng menangkap lebih dari sekali.Untuk mengilustrasikan yang terakhir, katakanlah Anda memiliki:
final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class); verify(x, times(4)).someMethod(captor.capture()); // for instance
Kemudian penculik akan dapat memberi Anda akses ke semua 4 argumen, yang kemudian Anda dapat melakukan pernyataan secara terpisah.
Sebenarnya ini atau sejumlah argumen, karena a
VerificationMode
tidak terbatas pada sejumlah pemanggilan tetap; Bagaimanapun, penculik akan memberi Anda akses ke semuanya, jika Anda mau.Ini juga memiliki keuntungan bahwa pengujian semacam itu (imho) jauh lebih mudah untuk ditulis daripada harus mengimplementasikan
ArgumentMatcher
s Anda sendiri - terutama jika Anda menggabungkan mockito dengan assertj.Oh, dan mohon pertimbangkan untuk menggunakan TestNG daripada JUnit.
sumber
Langkah-langkah untuk melakukan pemeriksaan lengkap adalah:
Siapkan penculik:
verifikasi panggilan untuk bergantung pada komponen (kolaborator subjek yang sedang diuji) kali (1), adalah nilai default, jadi ne perlu menambahkannya.
verify(dependentOnComponent, times(1)).send(someArgumentCaptor.capture());
times (1) adalah defaultnya, jadi tidak perlu menambahkannya.
Dapatkan argumen diteruskan ke kolaborator
someArgument bisa digunakan untuk pernyataan
sumber
Di sini saya memberi Anda contoh yang tepat dari satu metode panggilan balik. jadi misalkan kita memiliki metode seperti metode login ():
public void login() { loginService = new LoginService(); loginService.login(loginProvider, new LoginListener() { @Override public void onLoginSuccess() { loginService.getresult(true); } @Override public void onLoginFaliure() { loginService.getresult(false); } }); System.out.print("@@##### get called"); }
Saya juga meletakkan semua kelas helper di sini untuk membuat contoh lebih jelas: kelas loginService
public class LoginService implements Login.getresult{ public void login(LoginProvider loginProvider,LoginListener callback){ String username = loginProvider.getUsername(); String pwd = loginProvider.getPassword(); if(username != null && pwd != null){ callback.onLoginSuccess(); }else{ callback.onLoginFaliure(); } } @Override public void getresult(boolean value) { System.out.print("login success"+value); }}
dan kami memiliki pendengar LoginListener sebagai:
interface LoginListener { void onLoginSuccess(); void onLoginFaliure();
}
sekarang saya hanya ingin menguji metode login () dari kelas Login
@Test public void loginTest() throws Exception { LoginService service = mock(LoginService.class); LoginProvider provider = mock(LoginProvider.class); whenNew(LoginProvider.class).withNoArguments().thenReturn(provider); whenNew(LoginService.class).withNoArguments().thenReturn(service); when(provider.getPassword()).thenReturn("pwd"); when(provider.getUsername()).thenReturn("username"); login.getLoginDetail("username","password"); verify(provider).setPassword("password"); verify(provider).setUsername("username"); verify(service).login(eq(provider),captor.capture()); LoginListener listener = captor.getValue(); listener.onLoginSuccess(); verify(service).getresult(true);
juga jangan lupa untuk menambahkan anotasi di atas kelas pengujian sebagai
@RunWith(PowerMockRunner.class) @PrepareForTest(Login.class)
sumber
captor
didefinisikan dalam jawaban Anda?