Saya menggunakan Mockito untuk pengujian unit layanan nanti. Saya bingung ketika menggunakan doAnswer
vs thenReturn
.
Adakah yang bisa membantu saya secara detail? Sejauh ini saya sudah mencobanya dengan thenReturn
.
Anda harus menggunakan thenReturn
atau doReturn
jika Anda mengetahui nilai kembalian pada saat Anda memalsukan panggilan metode. Nilai yang ditentukan ini dikembalikan saat Anda menjalankan metode tiruan.
thenReturn(T value)
Menetapkan nilai kembali yang akan dikembalikan saat metode dipanggil.
@Test
public void test_return() throws Exception {
Dummy dummy = mock(Dummy.class);
int returnValue = 5;
// choose your preferred way
when(dummy.stringLength("dummy")).thenReturn(returnValue);
doReturn(returnValue).when(dummy).stringLength("dummy");
}
Answer
digunakan saat Anda perlu melakukan tindakan tambahan saat metode tiruan dipanggil, misalnya saat Anda perlu menghitung nilai hasil berdasarkan parameter panggilan metode ini.
Gunakan
doAnswer()
ketika Anda ingin menghentikan metode void dengan generikAnswer
.Jawaban menentukan tindakan yang dijalankan dan nilai yang dikembalikan saat Anda berinteraksi dengan tiruan.
@Test
public void test_answer() throws Exception {
Dummy dummy = mock(Dummy.class);
Answer<Integer> answer = new Answer<Integer>() {
public Integer answer(InvocationOnMock invocation) throws Throwable {
String string = invocation.getArgumentAt(0, String.class);
return string.length() * 2;
}
};
// choose your preferred way
when(dummy.stringLength("dummy")).thenAnswer(answer);
doAnswer(answer).when(dummy).stringLength("dummy");
}
code = UUID.randomUUID()
, saya menemukan tidak mungkin untuk menerapkan ini denganmockito
.Answer
just withreturn UUID.randomUUID();
.Answer
adalah antarmuka fungsional, jadi dengan Java 8 Anda dapat menggantinya dengan ekspresi lambda. Jika tidak cukup bersih, pemfaktoran ulang biasa dan tidak biasa lainnya dimungkinkan.doAnswer
danthenReturn
lakukan hal yang sama jika:Mari kita mengejek BookService ini
Anda bisa menghentikan getAuthor () menggunakan
doAnswer
danthenReturn
.Perhatikan bahwa saat menggunakan
doAnswer
, Anda tidak dapat meneruskan metodewhen
.Jadi, ketika Anda akan menggunakan
doAnswer
bukanthenReturn
? Saya dapat memikirkan dua kasus penggunaan:Dengan menggunakan doAnswer, Anda dapat melakukan beberapa tindakan tambahan setelah pemanggilan metode. Misalnya, memicu panggilan balik di queryBookTitle.
Saat menggunakan when-thenReturn on Spy Mockito akan memanggil metode nyata dan kemudian menghentikan jawaban Anda. Ini dapat menyebabkan masalah jika Anda tidak ingin memanggil metode nyata, seperti dalam contoh ini:
Dengan menggunakan doAnswer, kami dapat menghentikannya dengan aman.
Sebenarnya, jika Anda tidak ingin melakukan tindakan tambahan setelah pemanggilan metode, Anda bisa menggunakan
doReturn
.sumber
doAnswer(new Answer() { ... return null;}
saya mendapatkan peringatan di gerhana untuk "Jawaban adalah tipe mentah. Referensi untuk tipe umum Jawaban <T> harus diparameterisasi". Apakah ada cara untuk menyelesaikan ini (kecuali mengabaikan peringatan c)?