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