Metode Mocking Void dengan Mockito

1. Ikhtisar

Dalam tutorial singkat ini, kami fokus pada metode mocking void dengan Mockito.

Seperti artikel lain yang berfokus pada kerangka kerja Mockito (seperti Verifikasi Mockito, Kapan / Kemudian Mockito, dan Metode Mock Mockito), kelas MyList yang ditunjukkan di bawah ini akan digunakan sebagai kolaborator dalam kasus pengujian.

Kami akan menambahkan metode baru untuk tutorial ini:

public class MyList extends AbstractList { @Override public void add(int index, String element) { // no-op } }

2. Mengejek dan Memverifikasi Sederhana

Metode Void dapat digunakan dengan metode doNothing () , doThrow () , dan doAnswer () Mockito, membuat mocking dan verifikasi menjadi intuitif:

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); doNothing().when(myList).add(isA(Integer.class), isA(String.class)); myList.add(0, ""); verify(myList, times(1)).add(0, ""); }

Namun, doNothing () adalah perilaku default Mockito untuk metode void .

Versi whenAddCalledVerified () ini menyelesaikan hal yang sama seperti di atas:

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); myList(0, ""); verify(myList, times(1)).add(0, ""); } 

DoThrow () menghasilkan pengecualian:

@Test(expected = Exception.class) public void givenNull_AddThrows() { MyList myList = mock(MyList.class); doThrow().when(myList).add(isA(Integer.class), isNull()); myList.add(0, null); } 

Kami akan membahas doAnswer () di bawah.

3. Penangkapan Argumen

Salah satu alasan untuk mengganti perilaku default dengan doNothing () adalah untuk menangkap argumen.

Dalam contoh di atas, kami menggunakan metode verifikasi () untuk memeriksa argumen yang diteruskan ke add () .

Namun, kami mungkin perlu menangkap argumen dan melakukan sesuatu yang lebih dengan mereka.

Dalam kasus ini, kami menggunakan doNothing () seperti yang kami lakukan di atas, tetapi dengan ArgumentCaptor :

@Test public void whenAddCalledValueCaptured() { MyList myList = mock(MyList.class); ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class); doNothing().when(myList).add(any(Integer.class), valueCapture.capture()); myList.add(0, "captured"); assertEquals("captured", valueCapture.getValue()); } 

4. Menjawab Panggilan untuk Membatalkan

Suatu metode dapat melakukan perilaku yang lebih kompleks daripada sekadar menambahkan atau menetapkan nilai.

Untuk situasi ini, kita dapat menggunakan Jawaban Mockito untuk menambahkan perilaku yang kita butuhkan:

@Test public void whenAddCalledAnswered() { MyList myList = mock(MyList.class); doAnswer(invocation -> { Object arg0 = invocation.getArgument(0); Object arg1 = invocation.getArgument(1); assertEquals(3, arg0); assertEquals("answer me", arg1); return null; }).when(myList).add(any(Integer.class), any(String.class)); myList.add(3, "answer me"); } 

Seperti yang dijelaskan di Fitur Java 8 Mockito, kami menggunakan lambda dengan Answer untuk menentukan perilaku kustom untuk add () .

5. Mengolok-olok Parsial

Tiruan parsial juga merupakan pilihan. DoCallRealMethod () Mockito dapat digunakan untuk metode void :

@Test public void whenAddCalledRealMethodCalled() { MyList myList = mock(MyList.class); doCallRealMethod().when(myList).add(any(Integer.class), any(String.class)); myList.add(1, "real"); verify(myList, times(1)).add(1, "real"); } 

Dengan cara ini, kita dapat memanggil metode sebenarnya dan memverifikasinya pada saat yang bersamaan.

6. Kesimpulan

Dalam artikel singkat ini, kami membahas empat cara berbeda untuk mendekati metode kosong saat menguji dengan Mockito.

Seperti biasa, contoh tersedia di proyek GitHub ini.