ฉันใช้ Mockito สำหรับการทดสอบหน่วยบริการในภายหลัง ฉันกำลังสับสนเมื่อจะใช้VSdoAnswer
thenReturn
ใครสามารถช่วยฉันโดยละเอียด? จนถึงตอนนี้ฉันได้ลองใช้thenReturn
แล้ว
ฉันใช้ Mockito สำหรับการทดสอบหน่วยบริการในภายหลัง ฉันกำลังสับสนเมื่อจะใช้VSdoAnswer
thenReturn
ใครสามารถช่วยฉันโดยละเอียด? จนถึงตอนนี้ฉันได้ลองใช้thenReturn
แล้ว
คำตอบ:
คุณควรใช้thenReturn
หรือdoReturn
เมื่อคุณทราบค่าส่งคืนในเวลาที่คุณเยาะเย้ยการเรียกใช้เมธอด ค่าที่กำหนดนี้จะถูกส่งกลับเมื่อคุณเรียกใช้เมธอดจำลอง
thenReturn(T value)
ตั้งค่าการส่งคืนที่จะส่งคืนเมื่อมีการเรียกใช้เมธอด
@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
ถูกใช้เมื่อคุณต้องการดำเนินการเพิ่มเติมเมื่อมีการเรียกใช้เมธอดจำลองเช่นเมื่อคุณต้องการคำนวณค่าที่ส่งคืนตามพารามิเตอร์ของการเรียกใช้เมธอดนี้
ใช้เมื่อคุณต้องการต้นขั้ววิธีโมฆะกับทั่วไป
doAnswer()
Answer
คำตอบระบุการดำเนินการที่ดำเนินการและค่าส่งคืนที่ส่งคืนเมื่อคุณโต้ตอบกับการจำลอง
@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");
}
Answer
return UUID.randomUUID();
Answer
เป็นอินเทอร์เฟซที่ใช้งานได้ดังนั้นด้วย Java 8 คุณสามารถแทนที่ด้วยนิพจน์แลมบ์ดา หากยังไม่สะอาดเพียงพอการปรับโครงสร้างอื่น ๆ ตามปกติและผิดปกติก็เป็นไปได้
doAnswer
และthenReturn
ทำสิ่งเดียวกันหาก:
มาล้อเลียน BookService นี้
public interface BookService {
String getAuthor();
void queryBookTitle(BookServiceCallback callback);
}
คุณสามารถต้นขั้ว getAuthor () โดยใช้และdoAnswer
thenReturn
BookService service = mock(BookService.class);
when(service.getAuthor()).thenReturn("Joshua");
// or..
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return "Joshua";
}
}).when(service).getAuthor();
โปรดทราบว่าเมื่อใช้doAnswer
คุณจะไม่สามารถส่งต่อวิธีการwhen
ได้
// Will throw UnfinishedStubbingException
doAnswer(invocation -> "Joshua").when(service.getAuthor());
แล้วคุณจะใช้doAnswer
แทนเมื่อthenReturn
ไหร่? ฉันนึกถึงการใช้งานสองกรณี:
การใช้ doAnswer คุณสามารถดำเนินการเพิ่มเติมบางอย่างเมื่อเรียกใช้เมธอด ตัวอย่างเช่นทริกเกอร์การเรียกกลับบน queryBookTitle
BookServiceCallback callback = new BookServiceCallback() {
@Override
public void onSuccess(String bookTitle) {
assertEquals("Effective Java", bookTitle);
}
};
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
BookServiceCallback callback = (BookServiceCallback) invocation.getArguments()[0];
callback.onSuccess("Effective Java");
// return null because queryBookTitle is void
return null;
}
}).when(service).queryBookTitle(callback);
service.queryBookTitle(callback);
เมื่อใช้ when-thenReturn on Spy Mockito จะเรียกวิธีการจริงจากนั้นจะทำให้คำตอบของคุณสะดุด สิ่งนี้อาจทำให้เกิดปัญหาได้หากคุณไม่ต้องการเรียกใช้วิธีจริงเช่นในตัวอย่างนี้:
List list = new LinkedList();
List spy = spy(list);
// Will throw java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
when(spy.get(0)).thenReturn("java");
assertEquals("java", spy.get(0));
การใช้ doAnswer ทำให้เราสามารถตัดมันได้อย่างปลอดภัย
List list = new LinkedList();
List spy = spy(list);
doAnswer(invocation -> "java").when(spy).get(0);
assertEquals("java", spy.get(0));
doReturn
ที่จริงถ้าคุณไม่ต้องการที่จะทำดำเนินการเพิ่มเติมเมื่อวิธีการอุทธรณ์คุณก็สามารถใช้
List list = new LinkedList();
List spy = spy(list);
doReturn("java").when(spy).get(0);
assertEquals("java", spy.get(0));
doAnswer(new Answer() { ... return null;}
ฉันได้รับคำเตือนใน eclipse สำหรับ "คำตอบเป็นประเภทดิบการอ้างอิงถึงประเภททั่วไปคำตอบ <T> ควรกำหนดพารามิเตอร์" มีวิธีแก้ไขปัญหานี้หรือไม่ (ยกเว้นไม่สนใจคำเตือนของ c)
code = UUID.randomUUID()
mockito