5.1 วิธีการตรวจสอบ ()
นอกจากการสร้างวัตถุเสมือนแล้ว ยังมีงานที่น่าสนใจอีกอย่างเกิดขึ้น เพื่อให้แน่ใจว่าคลาสภายใต้การทดสอบเรียกใช้เมธอดที่ถูกต้องของวัตถุที่เหมาะสม ยิ่งไปกว่านั้น เขาเรียกจำนวนครั้งที่ต้องการพร้อมค่าพารามิเตอร์ที่ถูกต้อง และอื่นๆ
สำหรับสิ่งนี้ Mockito ยังมีเวทมนตร์ - ตระกูลของวิธีMockito.verify(…)
การ กฎทั่วไปที่ระบุการตรวจสอบการเรียกเมธอดคือ:
Mockito.verify(an object).method name(parameter);
ตัวอย่าง:
@ExtendWith(MockitoExtension.class)
class VerifyTest {
@Mock
List<String> mockList;
@Test
public void whenMockAnnotation() {
//method call
String name = mockList.get(10);
// check if the method was called
Mockito.verify(mockList).get(10);
}
}
ในระหว่างการเรียกเมธอดverify()
เราตั้งกฎว่าmockitoList
เมธอดที่มีพารามิเตอร์ 10 ควรถูกเรียก บนออบเจก get()
ต์
5.2 วิธีการตรวจสอบ () กับการตรวจสอบจำนวนการโทร
บางครั้งอาจมีสถานการณ์การตรวจสอบที่ซับซ้อนกว่านี้ ตัวอย่างเช่น คุณต้องตรวจสอบไม่เพียงแค่ข้อเท็จจริงที่ว่าเมธอดถูกเรียกใช้ แต่ตัวอย่างเช่น มันถูกเรียก 3 ครั้ง หรือถูกเรียกจากคุณเป็นวัฏจักร ดังนั้นจึงควรถูกเรียก N ครั้ง
เราจะไม่ถามว่าทำได้ไหม เราจะถามทันที: จะเขียนกฎดังกล่าวได้อย่างไร? และอีกครั้ง Mockito ไม่ทำให้เราผิดหวัง สามารถระบุกฎเป็น:
Mockito.verify(an object,quantity).method name(parameter);
สำคัญ! ปริมาณไม่ใช่ประเภทint
แต่เป็นวัตถุพิเศษที่สามารถกำหนดรูปแบบต่างๆ คุณจำวิธีการรุ่นต่างๆ ได้any()
หรือไม่ ที่นี่เหมือนกัน - มีวิธีการพิเศษที่คุณสามารถตั้งค่าสถานการณ์ต่างๆ ได้:
วิธี | คำอธิบาย | |
---|---|---|
1 | ไม่เคย() | ไม่ควรเรียกเมธอดนี้ |
2 | ครั้ง(n) | n ครั้ง |
3 | อย่างน้อย(n) | n ครั้งขึ้นไป |
4 | อย่างน้อยหนึ่งครั้ง() | 1 ครั้งขึ้นไป |
5 | ที่มากที่สุด(n) | n ครั้งหรือน้อยกว่า |
6 | เท่านั้น() | ควรมีการโทรเพียงครั้งเดียวและสำหรับวิธีนี้เท่านั้น |
ตัวอย่าง:
String name1 = mockList.get(1); //method call
String name2 = mockList.get(2); //method call
String name3 = mockList.get(3); //method call
//check that the get() method was called 3 times
Mockito.verify(mockList, times(3)).get(anyInt());
นอกจากนี้ คุณยังสามารถกำหนดให้นอกเหนือจากการเรียกใช้เมธอดที่ระบุห้ามทำการอ้างอิงอื่นใดไปยังออบเจกต์ มีกฎสำหรับสิ่งนี้:
Mockito.verifyNoMoreInteractions(an object);
5.3 วิธีการโทรสั่ง
กฎก่อนหน้านี้ไม่ได้ควบคุมลำดับของวิธีการโทร แต่อย่างใด กฎเพียงแค่ต้องปฏิบัติตามเท่านั้น แต่มีบางสถานการณ์ที่ลำดับการเรียกใช้เมธอดมีความสำคัญ และ Mockito ก็มีวิธีแก้ปัญหาสำหรับเรื่องนี้เช่นกัน
สามารถระบุลำดับการเรียกใช้เมธอดที่เข้มงวดได้โดยใช้วัตถุInOrder
พิเศษ ก่อนอื่นคุณต้องสร้าง:
InOrder inOrder = Mockito.inOrder(an object);
แล้วเพิ่มกฎเข้าไปโดยวิธีการverify()
เรียก
ตัวอย่าง:
List<String> mockedList = mock(MyList.class);
mockedList.size();
mockedList.add("a parameter");
mockedList.clear();
InOrder inOrder = Mockito.inOrder(mockedList);
inOrder.verify(mockedList).size();
inOrder.verify(mockedList).add("a parameter");
inOrder.verify(mockedList).clear();
5.4 การตรวจสอบข้อยกเว้นใน Mockito
ข้อเท็จจริงที่ว่าข้อยกเว้นถูกโยนออกไปนั้นถูกตรวจสอบแตกต่างกันเล็กน้อย ในการทำเช่นนี้ ให้ใช้วิธีassertThrows()
การ รูปแบบทั่วไปสำหรับการตรวจสอบดังกล่าวคือ:
Assertions.assertThrows(exception.class, () -> an object.methodname());
ไม่มีอะไรซับซ้อน
ตัวอย่าง:
@ExtendWith(MockitoExtension.class)
class ThenThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//set the behavior of the method (needed for demonstration purposes only)
Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);
//check if an IllegalStateException will be thrown when calling the size method
assertThrows(IllegalStateException.class, () -> mockList.size());
}
}
GO TO FULL VERSION