โค้ดยิม/หลักสูตรจาวา/โมดูล 3/การเรียกเมธอดจำลองด้วยพารามิเตอร์

การเรียกเมธอดจำลองด้วยพารามิเตอร์

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

4.1 พารามิเตอร์เมธอด

กฎก่อนหน้านี้ที่เพิ่มไปยังออบเจกต์จำลองจัดการกับเมธอดที่ไม่มีพารามิเตอร์ และจะสร้างกฎสำหรับเมธอดด้วยพารามิเตอร์ได้อย่างไร? นอกจากนี้ฉันต้องการสร้างกฎเพื่อให้ค่าพารามิเตอร์บางตัวมีผลลัพธ์เดียวและสำหรับค่าอื่น - อีกค่าหนึ่ง

นั่นเป็นวิธีที่คุณสามารถทำได้เช่นกัน หากคุณต้องการให้เมธอดคืนค่าบางอย่างด้วยพารามิเตอร์บางตัว กฎสามารถเขียนได้ดังนี้:

Mockito.doReturn(result).when(an object).method name(parameter);

ลองมาดูตัวอย่างเพื่อทำความเข้าใจกันดีกว่า ให้รายการของเราส่งคืนชื่อ Ivan เมื่อขอองค์ประกอบที่ 10 และชื่อ Marya เมื่อขอองค์ประกอบที่ 500 ไม่พูดเร็วกว่าทำ

@ExtendWith(MockitoExtension.class)
class ParamsTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //adding the first rule
        Mockito.doReturn("Ivan").when(mockList).get(10);
        //adding a second rule
        Mockito.doReturn("Maria").when(mockList).get(500);

        assertEquals("Ivan", mockList.get(10));
        assertEquals("Maria", mockList.get(500));

    }
}

4.2 เทมเพลตพารามิเตอร์

และเพื่อนร่วมงานที่มีไหวพริบจะถามคำถามฉันทันที: "จะเกิดอะไรขึ้นถ้าวิธีการต้องการการโต้แย้ง แต่สำหรับค่าใด ๆ จะต้องส่งคืนผลลัพธ์เดียวกัน" อย่าเขียน:

Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);

ไม่ ไม่มีใครบังคับให้คุณเขียนแบบนั้น หากคุณต้องการเพิ่มกฎให้กับอ็อบเจกต์จำลองที่ใช้ได้กับเมธอดที่มีอาร์กิวเมนต์ใดๆ ก็จะมีอ็อบเจกต์พิเศษสำหรับสิ่งนี้:

Mockito.any()

ตัวอย่างของเราจะเขียนดังนี้:

Mockito.doReturn("Ivan").when(mockList).get(any(int.class));

มีความแตกต่างเล็กน้อยที่นี่ วัตถุMockito.any()มีประเภทObjectดังนั้นจึงมีอะนาล็อกสำหรับพารามิเตอร์ประเภทต่างๆ:

วิธี ประเภทพารามิเตอร์
1 ใดๆ() วัตถุรวมถึง null
2 ใด ๆ (ClassName.class) ชื่อชั้น
3 anyInt() นานาชาติ
4 บูลีนใด ๆ () บูลีน
5 ดับเบิ้ลใด ๆ () สองเท่า
6 รายการใด ๆ () รายการ

ตัวอย่างของเราจะมีลักษณะดังนี้:

Mockito.doReturn("Ivan").when(mockList).get(anyInt());

4.3 วิธี doAnswer()

เราไปถึงพฤติกรรมที่ซับซ้อนของวิธีการเสมือน ไม่ช้าก็เร็วจะมีสถานการณ์ที่คุณต้องการให้วิธีการเสมือนนี้มีพฤติกรรมที่ซับซ้อน ตัวอย่างเช่น ควรคืนค่าตามพารามิเตอร์ แปลงสตริงเป็นตัวพิมพ์ใหญ่

มีวิธีการพิเศษสำหรับสิ่งนี้ - doAnswer()ซึ่งส่งผ่านฟังก์ชันที่ทำสิ่งที่คุณต้องการ:

Mockito.doAnswer(function).when(an object).method name(parameter);

ขอให้get()class method Listส่งคืนค่ากำลังสองของอาร์กิวเมนต์ที่ส่งไป และเขียนโปรแกรมต่อไปนี้:

@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        Mockito.doAnswer(invocation -> {
            int parameter = invocation.getArgument(0);
            return parameter * parameter;
        }).when(mockList).get(anyInt());

        assertEquals(100, mockList.get(10));
        assertEquals(25, mockList.get(5));
    }
}

เรากำหนดฟังก์ชันโดยใช้วัตถุของคลาส Answer

ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ