เมื่อใช้การจับคู่อาร์กิวเมนต์ Mockito อย่างกว้างขวางมีข้อควรพิจารณาหลายประการที่ต้องคำนึงถึง ในขณะที่ Mockito นั้นมีประสิทธิภาพโดยทั่วไปการใช้งานการจับคู่อาร์กิวเมนต์อย่างกว้างขวางสามารถแนะนำค่าใช้จ่ายบางอย่างเนื่องจากวิธีการที่ Mockito ประมวลผลการจับคู่เหล่านี้
1. การประมวลผล Matcher ค่าใช้จ่าย **
- การประเมินผลการจับคู่อาร์กิวเมนต์: เมื่อคุณใช้ตัวจับคู่อาร์กิวเมนต์เช่น `eq ()`, `any ()` `หรือ` anystring () `, mockito จำเป็นต้องประเมินการจับคู่เหล่านี้ในรันไทม์ กระบวนการประเมินผลนี้สามารถแนะนำค่าใช้จ่ายเล็กน้อยเมื่อเทียบกับการผ่านค่าที่แน่นอนโดยตรง อย่างไรก็ตามค่าโสหุ้ยนี้มักจะเล็กน้อยเว้นแต่คุณจะจัดการกับการเรียกร้องจำนวนมากหรือผู้จับคู่ที่ซับซ้อน2. กฎการรวมกันของ Matcher **
- อาร์กิวเมนต์ทั้งหมดจะต้องใช้เครื่องจับคู่: หากคุณใช้ตัวจับคู่อาร์กิวเมนต์สำหรับอาร์กิวเมนต์หนึ่งอาร์กิวเมนต์ทั้งหมดจะต้องใช้ตัวจับคู่ กฎนี้สามารถนำไปสู่รหัส verbose มากขึ้นและอาจมีค่าใช้จ่ายมากขึ้นหากคุณใช้เครื่องจับคู่สำหรับอาร์กิวเมนต์ทั้งหมดเมื่อมีเพียงหนึ่งเดียวที่ต้องการเงื่อนไขเฉพาะ ตัวอย่างเช่นหากวิธีการมีพารามิเตอร์สามตัวและคุณต้องการใช้ `ใด ๆ ()` สำหรับหนึ่งในนั้นคุณต้องใช้เครื่องจับคู่สำหรับอีกสองตัวเช่นกันแม้ว่าคุณจะใช้ค่าที่แน่นอนก็ตาม3. คู่จับคู่ที่กำหนดเอง **
- ตรรกะที่ซับซ้อน: ในขณะที่ Mockito มีตัวจับคู่ในตัวที่หลากหลายคุณอาจต้องสร้างเครื่องจับคู่แบบกำหนดเองสำหรับตรรกะเฉพาะ ตัวจับคู่แบบกำหนดเองอาจมีราคาแพงกว่าหากพวกเขาเกี่ยวข้องกับตรรกะหรือการดำเนินงานที่ซับซ้อน นี่เป็นเพราะพวกเขาจำเป็นต้องใช้อินเตอร์เฟส `arjormmatcher` และกำหนดวิธี` matches () `วิธีการตรวจสอบโดยพลการ4. การตรวจสอบค่าใช้จ่าย **
- การตรวจสอบด้วย matchers: เมื่อตรวจสอบการโต้ตอบกับวัตถุจำลองโดยใช้ `ตรวจสอบ ()`, Mockito ยังใช้เครื่องจับคู่เพื่อตรวจสอบว่ามีการส่งอาร์กิวเมนต์ที่ถูกต้องหรือไม่ เช่นเดียวกับ Stubbing การตรวจสอบกับผู้จับคู่สามารถแนะนำค่าใช้จ่ายบางอย่างโดยเฉพาะอย่างยิ่งหากคุณตรวจสอบการโทรหลายครั้งด้วยเครื่องจับคู่ที่ซับซ้อน5. แนวทางปฏิบัติที่ดีที่สุดสำหรับประสิทธิภาพ **
- ใช้ความจำเพาะอย่างชาญฉลาด: ใช้ตัวจับคู่ที่มีระดับความจำเพาะที่เหมาะสม ตัวอย่างเช่น `anyint ()` มีความเฉพาะเจาะจงน้อยกว่าและเร็วกว่า `eq (4)` แต่การใช้ `eq (4)` เมื่อคุณต้องการตรวจสอบค่าเฉพาะนั้นแม่นยำมากขึ้นและไม่ส่งผลกระทบต่อประสิทธิภาพอย่างมีนัยสำคัญ- หลีกเลี่ยงความซับซ้อนที่ไม่จำเป็น: หลีกเลี่ยงการใช้เครื่องจับคู่แบบกำหนดเองเว้นแต่จำเป็น หากการทดสอบต้องการตรรกะที่ซับซ้อนเพื่อให้ตรงกับอาร์กิวเมนต์ให้พิจารณาการทดสอบการทดสอบหรือการใช้เครื่องจับคู่ที่มีอยู่อย่างสร้างสรรค์
- โปรไฟล์การทดสอบของคุณ: หากคุณสังเกตเห็นปัญหาประสิทธิภาพในการทดสอบของคุณให้โปรไฟล์พวกเขาเพื่อระบุคอขวด มันหายากสำหรับ Mockito Matchers ที่จะเป็นสาเหตุหลักของปัญหาประสิทธิภาพที่สำคัญ แต่ก็เป็นการดีที่จะตรวจสอบเสมอ
โดยสรุปในขณะที่ผู้จับคู่อาร์กิวเมนต์ Mockito แนะนำค่าใช้จ่ายบางอย่าง แต่โดยทั่วไปแล้วไม่ใช่ข้อกังวลที่สำคัญเว้นแต่คุณจะต้องเผชิญกับการทดสอบที่ซับซ้อนหรือมีประสิทธิภาพมาก ประโยชน์ของการใช้เครื่องจับคู่เช่นความยืดหยุ่นและความชัดเจนในรหัสทดสอบมักจะมีค่าใช้จ่ายน้อยกว่าค่าใช้จ่ายเล็กน้อย
การอ้างอิง:[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-matcher-vs-passing-string-directly/56572275
[2] https://www.digitalocean.com/community/tutorials/mockito-argument-matchers-any-eq
[3] https://kenkousen.substack.com/p/tales-from-the-jar-side-a-mockito
[4] https://www.softwaretestinghelp.com/mockito-matchers/
[5] https://www.toptal.com/java/a-guide-to-ereryday-mockito
[6] https://github.com/etorreborre/specs2/issues/854
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.mockito.additionalmatchers
[8] https://stackoverflow.com/questions/73046134/ เมื่อ should-i-use-argument-matcher-or-passing-argument-directly-when-mockito-uni