คำตอบสั้น ๆ คือในตัวอย่างของคุณผลลัพธ์ของmock.method()จะเป็นค่าว่างที่เหมาะสมกับประเภท mockito ใช้การกำหนดทิศทางผ่านทางพร็อกซีการสกัดกั้นเมธอดและอินสแตนซ์ที่ใช้ร่วมกันของMockingProgressคลาสเพื่อพิจารณาว่าการเรียกใช้เมธอดในการจำลองนั้นใช้สำหรับการทำให้เป็นจุดบอดหรือเล่นซ้ำของพฤติกรรมที่ถูกตรึงที่มีอยู่แทนที่จะส่งข้อมูลเกี่ยวกับการแตกผ่านค่าส่งคืนของ วิธีการเยาะเย้ย
การวิเคราะห์ขนาดเล็กในสองสามนาทีเพื่อดูรหัสจำลองมีดังต่อไปนี้ หมายเหตุนี่เป็นคำอธิบายคร่าวๆ - มีรายละเอียดมากมายในการเล่นที่นี่ ฉันขอแนะนำให้คุณตรวจสอบแหล่งที่มาใน githubด้วยตัวคุณเอง
ขั้นแรกเมื่อคุณล้อเลียนชั้นเรียนโดยใช้mockวิธีการของMockitoชั้นเรียนนี่คือสิ่งที่เกิดขึ้นโดยพื้นฐาน:
Mockito.mockมอบหมายให้. org.mockito.internal.MockitoCoreม็อคส่งผ่านการตั้งค่าการจำลองเริ่มต้นเป็นพารามิเตอร์
MockitoCore.mockมอบหมายให้ . org.mockito.internal.util.MockUtilcreateMock
MockUtilระดับใช้ClassPathLoaderระดับที่จะได้รับตัวอย่างของMockMakerการใช้ในการสร้างจำลอง โดยค่าเริ่มต้นคลาสCgLibMockMakerจะถูกใช้
CgLibMockMakerใช้คลาสที่ยืมมาจาก JMock ClassImposterizerซึ่งจัดการกับการสร้างแบบจำลอง ชิ้นสำคัญของ 'Mockito มายากล' ใช้เป็นMethodInterceptorใช้ในการสร้างจำลอง: Mockito MethodInterceptorFilterและห่วงโซ่ของอินสแตนซ์ MockHandler รวมทั้งตัวอย่างของMockHandlerImpl ตัวสกัดกั้นเมธอดจะส่งการวิงวอนไปยังอินสแตนซ์ MockHandlerImpl ซึ่งใช้ตรรกะทางธุรกิจที่ควรใช้เมื่อมีการเรียกใช้เมธอดในการจำลอง (เช่นการค้นหาเพื่อดูว่ามีการบันทึกคำตอบไว้แล้วหรือไม่โดยพิจารณาว่าการเรียกใช้แทนต้นขั้วใหม่หรือไม่เป็นต้น สถานะดีฟอลต์คือถ้าไม่ได้ลงทะเบียนต้นขั้วสำหรับเมธอดที่เรียกใช้ค่าว่างที่เหมาะสมกับประเภทจะถูกส่งกลับ
ตอนนี้มาดูโค้ดในตัวอย่างของคุณ:
when(mock.method()).thenReturn(someValue)
นี่คือลำดับที่รหัสนี้จะดำเนินการใน:
mock.method()
when(<result of step 1>)
<result of step 2>.thenReturn
กุญแจสำคัญในการทำความเข้าใจสิ่งที่เกิดขึ้นเป็นสิ่งที่เกิดขึ้นเมื่อวิธีการในการจำลองที่ถูกเรียก: วิธีการสกัดกั้นจะถูกส่งข้อมูลเกี่ยวกับวิธีการอุทธรณ์และได้รับมอบหมายให้ห่วงโซ่ของอินสแตนซ์ซึ่งท้ายที่สุดก็มอบหมายให้MockHandler MockHandlerImpl#handleในระหว่างMockHandlerImpl#handleนั้นตัวจัดการจำลองจะสร้างอินสแตนซ์OngoingStubbingImplและส่งต่อไปยังMockingProgressอินสแตนซ์ที่แชร์
เมื่อwhenเมธอดถูกเรียกใช้หลังจากการเรียกใช้เมธอดmethod()นั้นจะมอบหมายให้MockitoCore.whenซึ่งเรียกใช้stub()เมธอดของคลาสเดียวกัน วิธีนี้จะคลายการแยกส่วนที่ต่อเนื่องออกจากMockingProgressอินสแตนซ์ที่ใช้ร่วมกันที่method()คำเรียกร้องจำลองเขียนลงไป จากนั้นthenReturnจึงเรียกวิธีการบนOngoingStubbingอินสแตนซ์