การรีเซ็ตการจำลองใน Mockito เป็นคุณสมบัติที่ช่วยให้คุณสามารถนำวัตถุจำลองกลับมาใช้ใหม่ได้โดยการล้างการโต้ตอบและการโต้ตอบ อย่างไรก็ตามการใช้ `รีเซ็ต ()` โดยทั่วไปจะหมดกำลังใจเว้นแต่จำเป็นอย่างยิ่งเนื่องจากอาจบ่งบอกถึงการทดสอบที่มีโครงสร้างไม่ดี นี่คือแนวทางปฏิบัติที่ดีที่สุดสำหรับการรีเซ็ตการจำลองใน Mockito:
ทำความเข้าใจเมื่อใดควรใช้ `reset ()`
-หลีกเลี่ยงการใช้ `รีเซ็ต ()`: เหตุผลหลัก `รีเซ็ต ()` มีอยู่คือการสนับสนุนการเยาะเย้ยแบบฉีดคอนเทนเนอร์เช่นที่ใช้ในรหัสดั้งเดิมหรืออินเทอร์เฟซของบุคคลที่สาม ในกรณีส่วนใหญ่โดยเฉพาะอย่างยิ่งกับรหัสที่ขับเคลื่อนด้วยการทดสอบที่ออกแบบมาอย่างดีคุณควรหลีกเลี่ยงการใช้ `รีเซ็ต ()` และมุ่งเน้นไปที่การสร้างวิธีการทดสอบขนาดเล็กที่มุ่งเน้น [2] [4]
- รหัสกลิ่น: หากคุณพบว่าตัวเองต้องการใช้ `รีเซ็ต ()` ภายในวิธีการทดสอบอาจเป็นสัญญาณว่าการทดสอบของคุณซับซ้อนเกินไปหรือครอบคลุมสถานการณ์มากเกินไป สิ่งนี้อาจบ่งบอกถึงความจำเป็นในการสร้างการทดสอบของคุณหรือรหัสที่ถูกทดสอบ [2]
ทางเลือกสำหรับ `รีเซ็ต ()`
- สร้างการเยาะเย้ยใหม่: แทนที่จะรีเซ็ตการเยาะเย้ยให้พิจารณาสร้างอินสแตนซ์จำลองใหม่สำหรับแต่ละวิธีการทดสอบ วิธีการนี้ช่วยให้มั่นใจได้ว่าการทดสอบแต่ละครั้งเริ่มต้นด้วยกระดานชนวนที่สะอาดลดความเสี่ยงของการโต้ตอบจากการทดสอบก่อนหน้านี้ที่มีผลต่อปัจจุบัน [4]
- ใช้ `ClearInvocations ()`: หากคุณต้องการล้างประวัติการเรียกร้อง (เช่นเพื่อตรวจสอบการโต้ตอบโดยไม่ส่งผลกระทบต่อการตับ) ให้ใช้ `mockito.learinvocations ()` วิธีนี้จะลบประวัติการเรียกร้องโดยไม่ต้องรีเซ็ตต้นขั้วซึ่งอาจเป็นประโยชน์ในบางสถานการณ์ [4]
แนวทางปฏิบัติที่ดีที่สุดสำหรับการรีเซ็ตการเยาะเย้ย
- รีเซ็ตหลังการทดสอบแต่ละครั้ง: หากคุณต้องรีเซ็ตการเยาะเย้ยให้ทำหลังจากวิธีทดสอบแต่ละครั้งโดยใช้ `@หลังจากคำอธิบายประกอบใน Junit หรือ` aftereach () `ใน Scalatest สิ่งนี้ทำให้มั่นใจได้ว่าการทดสอบแต่ละครั้งเริ่มต้นด้วยสถานะจำลองที่สะอาด [3] [10]
- หลีกเลี่ยงการรีเซ็ตก่อนการทดสอบ: รีเซ็ตการจำลองก่อนการทดสอบแต่ละครั้งอาจนำไปสู่ความสับสนเกี่ยวกับสิ่งที่ระบุว่าการเยาะเย้ยอยู่ในช่วงเริ่มต้นของการทดสอบ โดยทั่วไปจะชัดเจนกว่าที่จะสร้างการเยาะเย้ยใหม่หรือรีเซ็ตหลังการทดสอบ [10]
- ใช้คุณสมบัติเฟรมเวิร์ก: ในเฟรมเวิร์กเช่นฤดูใบไม้ผลิการใช้คำอธิบายประกอบเช่น `@Mockbean` สามารถจัดการการรีเซ็ตแบบจำลองโดยอัตโนมัติหลังจากการทดสอบแต่ละครั้งโดยไม่จำเป็นต้องรีเซ็ตด้วยตนเอง [10]
บทสรุป
ในขณะที่ Mockito ให้วิธี `รีเซ็ต ()` วิธีการใช้งานเฉพาะกรณีการใช้งานโดยทั่วไปขอแนะนำให้หลีกเลี่ยงการใช้งานเพื่อทำความสะอาดและออกแบบการทดสอบที่เน้นมากขึ้น ด้วยการสร้างการเยาะเย้ยใหม่สำหรับการทดสอบแต่ละครั้งหรือใช้คุณสมบัติเฟรมเวิร์กเพื่อจัดการสถานะจำลองคุณสามารถมั่นใจได้ว่าการทดสอบที่แข็งแกร่งและบำรุงรักษาได้โดยไม่จำเป็นต้องรีเซ็ตด้วยตนเอง
การอ้างอิง:[1] https://www.tutorialspoint.com/mockito/mockito_resetting_mock.htm
[2] https://site.mockito.org/javadoc/current/org/mockito/mockito.html
[3] https://twitter.github.io/finatra/user-guide/testing/mocks.html
[4] https://softwareengineering.stackexchange.com/questions/188299/is-this-an-appropripretu
[5] https://github.com/mockito/mockito-kotlin/issues/513
[6] https://symflower.com/en/company/blog/2024/how-to-do-mocking-spring-boot/
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/methods/org.mockito.mockito.reset
[8] https://github.com/mockito/mockito/issues/183
[9] https://www.toptal.com/java/a-guide-to-ereryday-mockito
[10] https://stackoverflow.com/questions/18164123/how-to-to-up-mocks-in-spring-tests-when-using-mockito