2016-10-05 17 views
9

Xin chào, tôi đã gặp phải sự cố khi cố gắng viết một trường hợp kiểm tra JUnit và tương đối mới với Mockito.Mockito - thenCallRealMethod() trên hàm void

Tôi có chức năng của một lớp mà tôi đang chế nhạo, chức năng này xảy ra là loại trả lại khoảng trống. Khi gọi hàm này từ lớp giả của tôi, đó là sự hiểu biết của tôi (và gỡ rối kinh nghiệm) rằng nó KHÔNG gọi hàm ban đầu. Để khắc phục điều này tôi đã cố gắng sử dụng một "khi" với một "thenCallRealMethod()".

when(instance.voidFunction()).thenCallRealMethod(); 

"voidFunction" có đầy đủ logic mà tôi KHÔNG muốn kích hoạt. Tôi đã trích xuất những điều này khi phát biểu để tránh điều đó. Tôi đã đọc rằng tôi nên sử dụng định dạng doReturn().when().voidFunction(), tuy nhiên làm điều này không gọi phương thức thực. Nó cũng là sự hiểu biết của tôi rằng tôi không thể sử dụng một Spy ở đây, do thực tế là tôi không muốn voidFunction() được gọi trước khi các câu lệnh "when". Bất kỳ trợ giúp được đánh giá cao tôi xin lỗi nếu đây là một giải pháp rất dễ dàng như sự hiểu biết của tôi về mockito không phải là rất tuyệt vời mặc dù đọc khá một chút. Cảm ơn!

+0

Câu trả lời của tôi cho [câu hỏi này] (http://stackoverflow.com/q/11462697) giải thích lý do tại sao tôi nghĩ cách làm/khi làm việc tốt hơn so với khi/sau đó. Nếu bạn chỉ học Mockito, thì bây giờ là lúc để đọc nó. –

+0

Cảm ơn bạn thực sự hữu ích, tôi đã học/dựa vào các tệp thử nghiệm của mình trong các tệp đã tồn tại trong codebase cũ của chúng tôi và đã thấy cả hai cách nhưng tôi đồng ý với lời khuyên của bạn sau khi chạy vào các nhược điểm của khi/sau đó hai lần đã là – CRDamico

+1

Nhầm lẫn người đọc trong tương lai cú pháp có thể. Xem xét cẩn thận bạn nên. –

Trả lời

14

Cú pháp when sẽ không hoạt động với phương thức trống (nó sẽ không vừa trong when) và doReturn không áp dụng khi không có giá trị trả về. doCallRealMethod có thể là câu trả lời bạn muốn.

doCallRealMethod().when(instance).voidFunction(); 

Gấu nhớ rằng khi gọi một phương pháp thực sự trên một mô hình, bạn có thể không nhận được hành vi rất thực tế, bởi vì không giống với gián điệp chế giễu đối tượng sẽ bỏ qua tất cả các cuộc gọi constructor và khởi tạo bao gồm cả những thiết lập các lĩnh vực. Điều đó có nghĩa là nếu phương pháp của bạn sử dụng bất kỳ trạng thái thể hiện nào, nó sẽ không hoạt động như một mô hình với doCallRealMethod hoặc thenCallRealMethod. Với một gián điệp, bạn có thể tạo ra một thể hiện thực sự của lớp học của bạn, và sau đó phương pháp Mockito.spy sẽ sao chép trạng thái cá thể đó để làm cho một tương tác thực tế hơn.

+0

Cảm ơn bạn, đó là chính xác những gì tôi cần, tôi đặc biệt tìm kiếm phương pháp đó và không thể tìm thấy nó. Có vẻ như nó đang hoạt động! – CRDamico

Các vấn đề liên quan