Melontar Pengecualian Mengejek menggunakan Mockito

1. Gambaran keseluruhan

Dalam tutorial ringkas ini - kami akan menumpukan pada cara mengkonfigurasi panggilan kaedah untuk membuat pengecualian dengan Mockito.

Untuk maklumat lebih lanjut mengenai perpustakaan, lihat juga siri Mockito kami.

Inilah kelas kamus ringkas yang akan kami gunakan dalam contoh berikut:

class MyDictionary { private Map wordMap = new HashMap(); public void add(String word, String meaning) { wordMap.put(word, meaning); } public String getMeaning(String word) { return wordMap.get(word); } }

2. Jenis Pengembalian Tanpa Void

Pertama, jika kaedah pengembalian kaedah kami tidak sah, kita boleh gunakan ketika (). KemudianThrow () :

@Test(expected = NullPointerException.class) public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); when(dictMock.getMeaning(anyString())) .thenThrow(NullPointerException.class); dictMock.getMeaning("word"); } 

Perhatikan, kami mengkonfigurasi metode getMeaning () - yang mengembalikan nilai jenis String - untuk membuang NullPointerException ketika dipanggil.

3. Jenis Pengembalian Tidak Sah

Sekarang, jika kaedah kami kembali tidak sah, kami akan menggunakan doThrow () :

@Test(expected = IllegalStateException.class) public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); doThrow(IllegalStateException.class) .when(dictMock) .add(anyString(), anyString()); dictMock.add("word", "meaning"); }

Di sini, kami mengkonfigurasi kaedah add () - yang mengembalikan kekosongan - untuk membuang IllegalStateException apabila dipanggil.

Kami tidak dapat menggunakan ketika (). KemudianThrow () dengan jenis pengembalian tidak sah kerana penyusun tidak membenarkan kaedah kekosongan di dalam kurungan.

4. Pengecualian sebagai Objek

Mengenai mengkonfigurasi pengecualian itu sendiri, kita dapat melewati kelas pengecualian seperti dalam contoh sebelumnya atau sebagai objek:

@Test(expected = NullPointerException.class) public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); when(dictMock.getMeaning(anyString())) .thenThrow(new NullPointerException("Error occurred")); dictMock.getMeaning("word"); }

Dan kita boleh melakukan perkara yang sama dengan doThrow () juga:

@Test(expected = IllegalStateException.class) public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); doThrow(new IllegalStateException("Error occurred")) .when(dictMock) .add(anyString(), anyString()); dictMock.add("word", "meaning"); }

5. Perisik

Kami juga dapat mengkonfigurasi Spy untuk membuang pengecualian seperti yang kami lakukan dengan mock:

@Test(expected = NullPointerException.class) public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dict = new MyDictionary(); MyDictionary spy = Mockito.spy(dict); when(spy.getMeaning(anyString())) .thenThrow(NullPointerException.class); spy.getMeaning("word"); }

6. Kesimpulannya

Dalam artikel ini, kami meneroka cara mengkonfigurasi panggilan kaedah untuk membuat pengecualian di Mockito.

Seperti biasa, kod sumber penuh boleh didapati di GitHub.