Vì vậy, tôi đã được yêu cầu đọc về chế nhạo và BDD cho nhóm phát triển của chúng tôi và chơi xung quanh với mocks để cải thiện một số bài kiểm tra đơn vị hiện có của chúng tôi (như một thử nghiệm). Tôi đã chọn Mockito vì một số lý do (một số bên ngoài phạm vi kiểm soát của tôi), nhưng cụ thể là vì nó hỗ trợ cả hai stubbing và chế nhạo cho các trường hợp khi chế nhạo sẽ không thích hợp.Mockito: Mocking "Blackbox" Dependencies
Tôi đã dành cả ngày để học về Mockito, chế nhạo (nói chung) và BDD. Và bây giờ tôi đã sẵn sàng đào sâu và bắt đầu tăng cường các bài kiểm tra đơn vị của chúng tôi.
Vì vậy, chúng ta có một lớp được gọi là WebAdaptor
rằng có một phương pháp run()
:
public class WebAdaptor {
private Subscriber subscriber;
public void run() {
subscriber = new Subscriber();
subscriber.init();
}
}
Xin lưu ý: (! Vì những lý do ngoài phạm vi của câu hỏi này) Tôi không có một cách để sửa đổi mã này . Do đó, tôi không phải có khả năng thêm phương thức setter cho Subscriber
và do đó, nó có thể được coi là "hộp đen" không thể truy cập được bên trong của tôi WebAdaptor
.
Tôi muốn viết một bài kiểm tra đơn vị kết hợp một mô hình Mockito
và sử dụng mô phỏng đó verify
thực hiện WebAdaptor::run()
làm cho số Subscriber::init()
được gọi.
Vì vậy, đây là những gì tôi đã có cho đến nay (bên WebAdaptorUnitTest
):
@Test
public void runShouldInvokeSubscriberInit() {
// Given
Subscriber mockSubscriber = mock(Subscriber.class);
WebAdaptor adaptor = new WebAdaptor();
// When
adaptor.run();
// Then
verify(mockSubscriber).init();
}
Khi tôi chạy thử nghiệm này, phương pháp thực tế Subscriber::init()
được thực hiện (tôi có thể nói từ giao diện điều khiển đầu ra và các tập tin nhìn thấy được tạo ra trên hệ thống cục bộ của tôi), không phải số mockSubscriber
, không được thực hiện (hoặc trả lại) bất kỳ thứ gì.
Tôi đã kiểm tra và tái kiểm tra: init
là public
, không phải là static
hoặc final
, và nó trả void
. Theo các tài liệu, Mockito sẽ không có vấn đề nhạo báng đối tượng này.
Vì vậy, điều đó khiến tôi suy nghĩ: tôi có cần phải liên kết rõ ràng mockSubscriber
với adaptor
không? Nếu đây là một trường hợp, sau đó bình thường, sau đây sẽ thường sửa chữa nó:
adaptor.setSubscriber(mockSubscriber);
Nhưng kể từ khi tôi không thể thêm bất kỳ setter như vậy (xin đọc lưu ý của tôi ở trên), tôi đang ở một mất mát như thế nào tôi có thể buộc một hiệp hội như vậy. Vì vậy, một số câu hỏi có liên quan chặt chẽ:
- Bất kỳ ai có thể xác nhận rằng tôi đã thiết lập kiểm tra chính xác (sử dụng API Mockito)?
- Nghi ngờ của tôi về người đặt thiếu có đúng không? (Tôi có cần phải liên kết các đối tượng này thông qua một setter không?)
- Nếu nghi ngờ trên của tôi là đúng và tôi không thể sửa đổi
WebAdaptor
, có bất kỳ vi phạm nào khi xử lý không?
Xin cảm ơn trước!
này không trực tiếp trả lời câu hỏi của bạn, nhưng JMockIt làm cho loại hộp đen chế giễu khá dễ dàng. JMockIt là một lựa chọn cho bạn? –
Người đăng ký đã khởi tạo như thế nào trong lớp học này? Có thể ghi đè lên mã instantiating để trả về một thể hiện mà bạn kiểm soát? –
run() là phương thức duy nhất sử dụng Subscriber, do đó, tất cả có nghĩa là nó phải là một biến cục bộ bên trong phương thức đó. Một lần nữa, tôi không thể thay đổi mã ... – IAmYourFaja