3.1 วิธีการ doReturn()
มาบัดนี้มายา...
สมมติว่าคุณสร้างวัตถุจำลองขึ้นมา แต่คุณต้องการให้มันทำงานด้วยวิธีใดวิธีหนึ่ง เมื่อมีการเรียกใช้เมธอดบางเมธอด มีการทำสิ่งที่สำคัญ หรือเมธอดส่งคืนผลลัพธ์บางอย่าง จะทำอย่างไร?
ไลบรารี Mockito ช่วยให้คุณสามารถเพิ่มลักษณะการทำงานที่ต้องการให้กับวัตถุจำลองได้
หากคุณต้องการให้วัตถุจำลองส่งคืนผลลัพธ์บางอย่างเมื่อมีการเรียกใช้เมธอดบางอย่าง คุณสามารถเพิ่ม "กฎ" นี้ลงในวัตถุโดยใช้รหัส:
Mockito.doReturn(result).when(an object).method name();
คุณเห็นไหมว่าในตอนท้ายของการเรียกเมธอดmethod name?
ไม่มีการเรียกเกิดขึ้นที่นี่ เมธอดdoReturn()
จะส่งคืนพร็อกซี-ออบเจ็กต์พิเศษด้วยความช่วยเหลือ ซึ่งเมธอดจะตรวจสอบการเรียกใช้เมธอดของออบเจ็กต์ และด้วยเหตุนี้ กฎจึงถูกเขียนขึ้น
อีกครั้ง. เป็นวิธีที่ชาญฉลาดในการเขียนกฎเพื่อเพิ่มไปยังวัตถุจำลอง ต้องใช้ทักษะบางอย่างในการตีความรหัสดังกล่าวในหัวของคุณอย่างถูกต้องเมื่อคุณเห็น มาพร้อมกับประสบการณ์
ฉันคิดว่าจำเป็นต้องมีตัวอย่างที่เป็นรูปธรรม มาสร้างวัตถุคลาสจำลองArrayList
และขอให้size()
เมธอดคืนค่าเป็น 10 โค้ดที่สมบูรณ์จะมีลักษณะดังนี้:
@ExtendWith(MockitoExtension.class)
class DoReturnTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation () {
//create a rule: return 10 when calling the size method
Mockito.doReturn(10).when(mockList).size();
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
ใช่ รหัสนี้จะใช้งานได้ การทดสอบจะไม่ล้มเหลว
3.2 เมธอด when()
มีอีกวิธีในการเพิ่มกฎพฤติกรรมให้กับวัตถุจำลอง - โดยการเรียกMockito.when()
ใช้ ดูเหมือนว่า:
Mockito.when(an object.method name()).thenReturn(result);
นี่เป็นวิธีเดียวกับการเขียนกฎพฤติกรรมของวัตถุจำลองเหมือนก่อนหน้านี้ เปรียบเทียบ:
Mockito.doReturn(result).when(an object).method name();
สิ่งเดียวกันนี้เกิดขึ้นที่นี่ - การสร้างกฎใหม่
จริง ตัวอย่างแรกมีสองข้อเสีย:
- การโทรสับสนมาก
an object.method name()
- จะไม่ทำงานหากวิธีการ
methodname()
ส่งvoid
คืน
ลองเขียนตัวอย่างที่เราชื่นชอบโดยใช้Mockito.when()
@ExtendWith(MockitoExtension.class)
class WhenTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//create a rule: return 10 when calling the size method
Mockito.when(mockList.size() ).thenReturn(10);
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
3.3 วิธีการ doThrow()
เราค้นพบวิธีทำให้เมธอดวัตถุจำลองส่งคืนผลลัพธ์เฉพาะ ฉันจะทำให้มันเป็นข้อยกเว้นเฉพาะได้อย่างไร ส่งมาที่doReturn()
?
เพื่อป้องกันไม่ให้เมธอดส่งคืน นั่นคือการโยนข้อยกเว้น คุณต้องตั้งค่ากฎโดยใช้ไฟล์doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
จากนั้นตัวเลือกที่สอง:
Mockito.when(an object.method name()).thenThrow(exception.class);
ค่อนข้างคาดหวังใช่ไหม?
เอาล่ะ คุณเริ่มเข้าใจแล้ว ลองแก้ไขด้วยตัวอย่าง:
@ExtendWith(MockitoExtension.class)
class DoThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
mockList.size(); //an exception will be thrown here
}
}
หากคุณต้องการส่งวัตถุยกเว้นเฉพาะ ให้ใช้การสร้างแบบฟอร์ม:
Mockito.doThrow(new Exception()).when(an object).method name();
เพียงแค่ส่งdoThrow()
วัตถุข้อยกเว้นไปยังเมธอดและมันจะถูกส่งออกไประหว่างการเรียกใช้เมธอด