โค้ดยิม/หลักสูตรจาวา/โมดูล 3/เปิดเผยพฤติกรรมเฉพาะในวัตถุ

เปิดเผยพฤติกรรมเฉพาะในวัตถุ

ระดับ, บทเรียน
มีอยู่

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());
    }
}
ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ