นี่เป็นคำถามที่ยอดเยี่ยม! ฉันคิดว่าสาเหตุของมันคือต่อไปนี้เราใช้ JUnit ไม่เพียง แต่สำหรับการทดสอบหน่วย ดังนั้นคำถามควรแยกออกเป็น:
- ฉันควรใช้ Mockito.verify () ในของฉันบูรณาการ (หรือการทดสอบอื่น ๆ สูงกว่าหน่วย) การทดสอบ?
- ฉันควรใช้ Mockito.verify () ในการทดสอบหน่วยกล่องดำของฉันหรือไม่
- ฉันควรใช้ Mockito.verify () ในการทดสอบหน่วยกล่องขาวหรือไม่
ดังนั้นหากเราจะเพิกเฉยต่อการทดสอบที่สูงกว่าหน่วยคำถามสามารถใช้ถ้อยคำใหม่ได้ " การใช้การทดสอบหน่วยกล่องสีขาวกับ Mockito.verify () สร้างคู่ที่ยอดเยี่ยมระหว่างการทดสอบหน่วยกับการใช้งานของฉันฉันสามารถสร้างกล่องสีเทา "การทดสอบหน่วยและกฎง่ายๆที่ฉันควรใช้ในการนี้ "
ทีนี้มาดูทีละขั้นตอนกัน
* - ฉันควรใช้ Mockito.verify () ในการทดสอบการรวม (หรือการทดสอบที่สูงกว่าหน่วยอื่น ๆ) ของฉันหรือไม่ * ฉันคิดว่าคำตอบนั้นชัดเจนไม่มากไปกว่านั้นคุณไม่ควรใช้ mocks สำหรับสิ่งนี้ การทดสอบของคุณควรใกล้เคียงกับแอปพลิเคชันจริงมากที่สุด คุณกำลังทดสอบกรณีการใช้งานที่สมบูรณ์ไม่ใช่ส่วนหนึ่งของแอปพลิเคชัน
* กล่องดำ VS กล่องสีขาวหน่วยทดสอบ * ถ้าคุณกำลังใช้กล่องดำวิธีการสิ่งที่คุณกำลังทำจริงๆคุณจัดหา (ทุกชั้นสมมูล) นำเข้าเป็นรัฐการส่งออกและการทดสอบที่คุณคาดว่าจะได้รับ ในวิธีการใช้ mocks โดยทั่วไปนี้เป็นสิ่งที่ชอบธรรม (คุณแค่เลียนแบบว่าพวกเขากำลังทำสิ่งที่ถูกต้องคุณไม่ต้องการทดสอบพวกเขา) แต่การโทร Mockito.verify () นั้นไม่จำเป็น
หากคุณใช้วิธีการแบบกล่องขาวในสิ่งที่คุณทำจริงๆคุณกำลังทดสอบพฤติกรรมของหน่วยของคุณ ในวิธีนี้การโทรไปที่ Mockito.verify () เป็นสิ่งสำคัญคุณควรตรวจสอบว่าหน่วยของคุณทำงานตามที่คุณคาดหวัง
กฎของหัวแม่มือสำหรับการทดสอบกล่องสีเทา
ปัญหากับการทดสอบกล่องขาวคือมันสร้างการมีเพศสัมพันธ์สูง ทางออกหนึ่งที่เป็นไปได้คือทำการทดสอบกล่องสีเทาไม่ใช่การทดสอบกล่องขาว นี่คือการรวมกันของการทดสอบกล่องขาวดำ คุณจริงๆทดสอบพฤติกรรมของหน่วยของคุณเช่นในการทดสอบกล่องสีขาว แต่โดยทั่วไปจะทำให้การดำเนินงานไม่เชื่อเรื่องพระเจ้าเมื่อเป็นไปได้ เมื่อเป็นไปได้คุณจะทำการตรวจสอบเช่นในกรณีกล่องดำเพียงแค่ยืนยันว่าการส่งออกเป็นสิ่งที่คุณคาดหวัง ดังนั้นสาระสำคัญของคำถามของคุณคือเมื่อเป็นไปได้
มันยากจริงๆ ฉันไม่มีตัวอย่างที่ดี แต่ฉันสามารถยกตัวอย่างให้คุณได้ ในกรณีที่กล่าวถึงข้างต้นด้วย equals () และ vs equalsIgnoreCase () คุณไม่ควรเรียก Mockito.verify () เพียงแค่ยืนยันเอาต์พุต หากคุณไม่สามารถทำได้ให้แบ่งรหัสของคุณเป็นหน่วยย่อย ๆ จนกว่าคุณจะสามารถทำได้ ในทางกลับกันสมมติว่าคุณมี @Service บางส่วนและคุณกำลังเขียน @ Web-Service ที่เป็นตัวห่อหุ้มที่ @Service ของคุณ - มันจะมอบหมายการเรียกทั้งหมดไปยัง @Service (และทำให้เกิดข้อผิดพลาดพิเศษบางอย่าง) ในกรณีนี้การโทรไปที่ Mockito.verify () เป็นสิ่งสำคัญคุณไม่ควรทำซ้ำการตรวจสอบทั้งหมดที่คุณทำกับ @Serive เพื่อยืนยันว่าคุณกำลังโทรหา @Service ด้วยรายการพารามิเตอร์ที่ถูกต้องก็เพียงพอแล้ว