Câu trả lời ngắn gọn là trong ví dụ của bạn, kết quả của mock.method()
sẽ là một giá trị trống phù hợp với kiểu; mockito sử dụng hướng dẫn thông qua ủy quyền, đánh chặn phương thức và một phiên bản được chia sẻ của MockingProgress
lớp để xác định xem liệu một lệnh gọi một phương thức trên một mô hình là để khai thác hoặc phát lại một hành vi sơ khai hiện có thay vì truyền thông tin về khai thác thông qua giá trị trả về một phương pháp chế nhạo.
Một phân tích nhỏ trong vài phút về mã mockito như sau. Lưu ý, đây là một mô tả rất thô - có rất nhiều chi tiết đang chơi ở đây. Tôi khuyên bạn nên tự mình kiểm tra nguồn trên github .
Đầu tiên, khi bạn mô phỏng một lớp bằng cách sử dụng mock
phương thức của Mockito
lớp, đây về cơ bản là những gì sẽ xảy ra:
Mockito.mock
đại biểu cho org.mockito.internal.MockitoCore
.mock, chuyển cài đặt giả lập mặc định dưới dạng tham số.
MockitoCore.mock
đại biểu cho org.mockito.internal.util.MockUtil
.createMock
- Các
MockUtil
lớp học sử dụng các ClassPathLoader
lớp để có được một thể hiện của MockMaker
sử dụng để tạo ra các mô hình. Theo mặc định, lớp CgLibMockMaker được sử dụng.
CgLibMockMaker
sử dụng một lớp được mượn từ JMock ClassImposterizer
để xử lý việc tạo mô hình. Các phần chính của 'ma thuật mockito' được MethodInterceptor
sử dụng để tạo ra mô hình: mockito MethodInterceptorFilter
, và một chuỗi các trường hợp MockHandler, bao gồm cả một phiên bản MockHandlerImpl . Bộ đánh chặn phương thức chuyển lời gọi đến cá thể MockHandlerImpl, thực hiện logic nghiệp vụ sẽ được áp dụng khi một phương thức được gọi trên một mô hình (tức là, tìm kiếm để xem liệu câu trả lời đã được ghi lại chưa, xác định xem lời gọi đó có đại diện cho một sơ khai mới hay không, v.v. Trạng thái mặc định là nếu một sơ khai chưa được đăng ký cho phương thức đang được gọi, một giá trị trống phù hợp với kiểu sẽ được trả về.
Bây giờ, hãy xem mã trong ví dụ của bạn:
when(mock.method()).thenReturn(someValue)
Đây là thứ tự mà mã này sẽ thực thi:
mock.method()
when(<result of step 1>)
<result of step 2>.thenReturn
Chìa khóa để hiểu điều gì đang xảy ra là điều gì sẽ xảy ra khi phương thức trên mô hình được gọi: bộ đánh chặn phương thức được chuyển thông tin về lời gọi phương thức và ủy quyền cho chuỗi các MockHandler
trường hợp của nó , mà cuối cùng sẽ ủy quyền MockHandlerImpl#handle
. Trong khi đó MockHandlerImpl#handle
, trình xử lý giả tạo một thể hiện của OngoingStubbingImpl
và chuyển nó đến thể hiện được chia sẻ MockingProgress
.
Khi when
phương thức được gọi sau lời gọi method()
, nó sẽ ủy quyền cho MockitoCore.when
, stub()
phương thức này sẽ gọi phương thức của cùng một lớp. Phương thức này giải nén phần sơ khai đang diễn ra từ MockingProgress
trường hợp được chia sẻ mà method()
lời gọi giả mạo đã viết vào và trả về nó. Sau đó, thenReturn
phương thức sau đó được gọi trên OngoingStubbing
cá thể.