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()วัตถุข้อยกเว้นไปยังเมธอดและมันจะถูกส่งออกไประหว่างการเรียกใช้เมธอด