WhiteBox ของ Powermock และ Whitebox ของ Mockito เป็นทั้งคลาสยูทิลิตี้ที่ใช้ในการเข้าถึงและจัดการสถานะภายในของชั้นเรียน แต่พวกเขามีความแตกต่างที่แตกต่างกันในต้นกำเนิดฟังก์ชันการทำงานและบริบทการใช้งาน
ต้นกำเนิดและความพร้อมใช้งาน
- Whitebox ของ Mockito: นี่คือคลาสภายในภายใน Mockito ที่อนุญาตให้ผู้ใช้ตั้งสถานะภายในของวัตถุ อย่างไรก็ตามมันถูกลบออกจาก Mockito 2.x เนื่องจากความกังวลเกี่ยวกับการส่งเสริมการทดสอบที่ไม่ดีและเนื่องจากไม่ได้มีไว้สำหรับการใช้งานสาธารณะ [11] ผู้ใช้ที่พึ่งพามันได้รับการสนับสนุนให้เปลี่ยนเป็นทางเลือกอื่น ๆ เช่น Whitebox ของ Powermock หรือใช้ยูทิลิตี้สะท้อนของตนเอง [3]
- WhiteBox ของ Powermock: นี่เป็นส่วนหนึ่งของ Powermock Library ซึ่งขยายความสามารถของ Mockito โดยอนุญาตให้เยาะเย้ยวิธีการส่วนตัวคงที่และสุดท้ายในหมู่คุณสมบัติอื่น ๆ [5] WhiteBox ของ Powermock ให้บริการยูทิลิตี้สะท้อนแสงที่เรียบง่ายสำหรับการทดสอบทำให้สามารถเข้าถึงสมาชิกส่วนตัวและการเรียกใช้วิธีการส่วนตัว [2] [6]
ฟังก์ชันการทำงาน
- WhiteBox ของ Mockito (ประวัติศาสตร์): ก่อนการลบ Whitebox ของ Mockito อนุญาตให้ผู้ใช้ตั้งสถานะภายในของวัตถุโดยใช้วิธีการเช่น `setinternalstate` สิ่งนี้มีประโยชน์สำหรับการฉีดยาจำลองเข้าไปในชั้นเรียนที่ไม่มีตัวตั้งค่าสาธารณะ
- Whitebox ของ Powermock: เสนอชุดฟังก์ชันที่กว้างขึ้นรวมถึง:
- การเข้าถึงสมาชิกส่วนตัว: วิธีการเช่น `getInternalstate` อนุญาตให้ดึงค่าฟิลด์ส่วนตัว
- การเรียกใช้วิธีการส่วนตัว: วิธี `invokemethod` สามารถโทรหาวิธีส่วนตัวรวมถึงวิธีการคงที่ [4] [10]
- การตั้งค่าฟิลด์ส่วนตัว: ในขณะที่ไม่ได้บันทึกไว้อย่างชัดเจน WhiteBox ของ Powermock สามารถใช้ในการตั้งค่าฟิลด์ส่วนตัวผ่านการสะท้อนแม้ว่านี่จะไม่ใช่วัตถุประสงค์หลัก
บริบทการใช้งาน
- Whitebox ของ Mockito: เนื่องจากไม่มีใน Mockito 2.x อีกต่อไปผู้ใช้จึงได้รับคำแนะนำให้ใช้ทางเลือกอื่นเช่น Whitebox ของ Powermock หรือ `ReflectionTestutils 'ของ Powermock หากมี [1] [3]
- Whitebox ของ Powermock: โดยทั่วไปจะใช้ในสถานการณ์ที่จำเป็นต้องเข้าถึงสมาชิกหรือวิธีการส่วนตัวโดยตรงมักจะอยู่ในรหัสดั้งเดิมหรือเมื่อทดสอบตรรกะที่ซับซ้อนซึ่งไม่สามารถปรับเปลี่ยนได้ง่าย อย่างไรก็ตามโดยทั่วไปขอแนะนำให้หลีกเลี่ยงการใช้ยูทิลิตี้ดังกล่าวเว้นแต่จำเป็นอย่างยิ่งที่พวกเขาสามารถข้ามการห่อหุ้มและนำไปสู่การทดสอบที่เปราะบาง [10]
โดยสรุปในขณะที่ยูทิลิตี้ WhiteBox ทั้งสองมีจุดประสงค์ที่คล้ายกันเวอร์ชันของ Powermock นั้นครอบคลุมและมีอยู่อย่างกว้างขวางมากขึ้นในขณะที่รุ่นของ Mockito ถูกลบออกเนื่องจากความกังวลเกี่ยวกับการทดสอบ Whitebox ของ Powermock เป็นเครื่องมือที่ทรงพลังสำหรับการเข้าถึงและจัดการกับสถานะชั้นเรียนภายใน แต่ควรใช้อย่างรอบคอบ
การอ้างอิง:[1] https://stackoverflow.com/questions/40280918/ what-do-use-in-instead-of-whitebox-in-mockito-2-2-2--to-set-fields
[2] https://www.javadoc.io/doc/org.powermock/powermock-reflect/1.6.5/org/powermock/reflect/whitebox.html
[3] https://proandroiddev.com/mockito-2-x-over-powermock-migration-tips-and-tricks-top-ten-ten-TEN-TEN-118C52ABD1D8
[4] https://johnmullins.co
[5] https://www.calsoftinc.com/blogs/unit-testing-mockito-powermockito.html
[6] https://www.javadoc.io/doc/org.powermock/powermock-reflect/latest/org/powermock/reflect/whitebox.html
[7] https://github.com/mockito/mockito/issues/422
[8] https://www.alibabacloud.com/blog/598057
[9] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.powermock.reflect.whitebox
[10] https://github.com/powermock/powermock/wiki/bypass-encapsulation
[11] https://github.com/mockito/mockito/issues/489
[12] https://code.haleby.se/2017/02/03/a-case-for-powermock/