6.1 การเยาะเย้ยเมธอดสแตติก mockStatic()
และอีกหนึ่งจุดสำคัญคือการเยาะเย้ยและการตรวจสอบวิธีการแบบคงที่ "เกิดอะไรขึ้นกับสิ่งนั้น" คุณถาม ใช่คงที่ แต่วิธีการเหมือนกัน และคุณจะคิดผิด
จำได้ไหมว่าเราเริ่มเรียนรู้เกี่ยวกับวัตถุจำลองจากที่ใด เนื่องจากวัตถุเหล่านี้ถูกสร้างขึ้นเทียมผ่านDynamicProxy
. และเมธอดแบบสแต ติกจะไม่ถูกผูกมัดกับวัตถุใด ๆ และDynamicProxy
เป็นไปไม่ได้ ที่จะสกัดกั้นการเรียกผ่าน นั่นคือทั้งหมด
แต่ผู้สร้าง Mockito ก็สามารถหลบที่นี่ได้เช่นกัน - พวกเขาเขียนตัวโหลดคลาสของตนเอง และด้วยความช่วยเหลือของมัน พวกเขาสามารถแทนที่คลาสได้ทันที งานใหญ่และยาก แต่พวกเขาก็ยังทำมันได้
คุณจะต้องเพิ่มห้องสมุดเพิ่มเติมเพื่อpom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
นี่คือวิธีการทำงานหากคุณต้องการจำลองวิธีการแบบคงที่
1 สร้างวัตถุคลาสจำลองพิเศษ:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 เพิ่มกฎการดำเนินการให้กับวัตถุนี้:
สำหรับเป้าหมายของกฎนี้จำเป็นต้องยึดมั่นในวิธีอื่น
managerObject.when(ClassName::method name).thenReturn(result);
3 ตรวจสอบ ให้แน่ใจว่าได้รวมการใช้วัตถุนี้ไว้try-with-resources
เพื่อให้วัตถุนั้นถูกลบทันทีและ Mockito สามารถล้างกฎที่เกี่ยวข้องได้
ตัวอย่าง:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
ไม่สวยเท่าคำอธิบายประกอบ@Mock
และ@Spy
แต่ใช้งานได้จริงมาก มันยากมากที่จะเขียนการทดสอบเมื่อเป็นไปไม่ได้ที่จะจำลองวิธีการแบบคงที่อย่างง่ายที่ใช้ในวิธีการทดสอบ