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แต่ใช้งานได้จริงมาก มันยากมากที่จะเขียนการทดสอบเมื่อเป็นไปไม่ได้ที่จะจำลองวิธีการแบบคงที่อย่างง่ายที่ใช้ในวิธีการทดสอบ