คำตอบสั้น ๆ คือในตัวอย่างของคุณผลลัพธ์ของmock.method()
จะเป็นค่าว่างที่เหมาะสมกับประเภท mockito ใช้การกำหนดทิศทางผ่านทางพร็อกซีการสกัดกั้นเมธอดและอินสแตนซ์ที่ใช้ร่วมกันของMockingProgress
คลาสเพื่อพิจารณาว่าการเรียกใช้เมธอดในการจำลองนั้นใช้สำหรับการทำให้เป็นจุดบอดหรือเล่นซ้ำของพฤติกรรมที่ถูกตรึงที่มีอยู่แทนที่จะส่งข้อมูลเกี่ยวกับการแตกผ่านค่าส่งคืนของ วิธีการเยาะเย้ย
การวิเคราะห์ขนาดเล็กในสองสามนาทีเพื่อดูรหัสจำลองมีดังต่อไปนี้ หมายเหตุนี่เป็นคำอธิบายคร่าวๆ - มีรายละเอียดมากมายในการเล่นที่นี่ ฉันขอแนะนำให้คุณตรวจสอบแหล่งที่มาใน githubด้วยตัวคุณเอง
ขั้นแรกเมื่อคุณล้อเลียนชั้นเรียนโดยใช้mock
วิธีการของMockito
ชั้นเรียนนี่คือสิ่งที่เกิดขึ้นโดยพื้นฐาน:
Mockito.mock
มอบหมายให้. org.mockito.internal.MockitoCore
ม็อคส่งผ่านการตั้งค่าการจำลองเริ่มต้นเป็นพารามิเตอร์
MockitoCore.mock
มอบหมายให้ . org.mockito.internal.util.MockUtil
createMock
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
อินสแตนซ์