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 MockingProgresslớ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 mockphương thức của Mockitolớ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
MockUtillớp học sử dụng các ClassPathLoaderlớp để có được một thể hiện của MockMakersử dụng để tạo ra các mô hình. Theo mặc định, lớp CgLibMockMaker được sử dụng.
CgLibMockMakersử 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 MethodInterceptorsử 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 MockHandlertrườ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 OngoingStubbingImplvà chuyển nó đến thể hiện được chia sẻ MockingProgress.
Khi whenphươ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ừ MockingProgresstrường hợp được chia sẻ mà method()lời gọi giả mạo đã viết vào và trả về nó. Sau đó, thenReturnphương thức sau đó được gọi trên OngoingStubbingcá thể.