Kaedah Mengolok-olokkan Mockito dengan Mockito

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kami menumpukan pada kaedah mengejek kekosongan dengan Mockito.

Seperti artikel lain yang difokuskan pada kerangka Mockito (seperti Mockito Verify, Mockito When / Then, dan Mockito's Mock Methods), kelas MyList yang ditunjukkan di bawah akan digunakan sebagai kolaborator dalam kes ujian.

Kami akan menambahkan kaedah baru untuk tutorial ini:

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

2. Mengejek dan Mengesahkan Ringkas

Kaedah Void boleh digunakan dengan kaedah Mockito's doNothing () , doThrow () , dan doAnswer () , membuat ejekan dan mengesahkan 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, ""); }

Walau bagaimanapun, doNothing () adalah tingkah laku lalai Mockito untuk kaedah tidak sah .

Versi whenAddCalledVerified () mencapai perkara yang sama seperti yang 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. Tangkapan Hujah

Salah satu sebab untuk mengatasi tingkah laku lalai dengan doNothing () adalah menangkap argumen.

Dalam contoh di atas, kami menggunakan kaedah verifikasi () untuk memeriksa argumen yang dilampirkan untuk menambahkan () .

Walau bagaimanapun, kita mungkin perlu menangkap hujah dan melakukan sesuatu yang lebih banyak dengan mereka.

Dalam kes 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 Tidak Sah

Kaedah boleh melakukan tingkah laku yang lebih kompleks daripada sekadar menambah atau menetapkan nilai.

Untuk situasi seperti ini, kita dapat menggunakan Jawapan Mockito untuk menambahkan tingkah laku yang kita perlukan:

@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 dalam Fitur Java 8 Mockito, kami menggunakan lambda dengan Jawapan untuk menentukan tingkah laku khusus untuk menambahkan () .

5. Mengejek Sebahagian

Mengejek separa juga pilihan. Mockito's doCallRealMethod () boleh digunakan untuk kaedah batal :

@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 kaedah sebenar dan mengesahkannya pada masa yang sama.

6. Kesimpulannya

Dalam artikel ringkas ini, kami membahas empat cara berbeza untuk mendekati kaedah batal ketika menguji dengan Mockito.

Seperti biasa, contohnya terdapat dalam projek GitHub ini.