Java xác minh phương thức void gọi n lần với Mockito


140

Tôi đang cố gắng xác minh rằng phương thức (void) đang được gọi bên trong DAO - Tôi đang sử dụng một điểm cam kết gửi danh sách kết quả cho đến thời điểm đó, đặt lại danh sách và tiếp tục. Giả sử tôi có 4 thứ trong danh sách và tôi có điểm cam kết là 1, tôi sẽ mong phương thức "gửi" được gọi 4 lần. Tôi có thể xác minh rằng phương thức được gọi một lần bằng cách viết

Mockito.verify(mock).send()

nó vượt qua .. nhưng tôi muốn xác minh số lần nó được gọi. Tôi sẽ nghĩ rằng

Mockito.verify(mock.send(), times(4))

sẽ là đủ, nhưng nó nói các tham số không chính xác để xác minh.

Ngẫu nhiên, nếu tôi thay đổi Mockito.verify(mock).send()đến Mockito.verify(mock.send())hoặc Mockito.verify((mock).send())tôi nhận được lỗi tương tự. Suy nghĩ về điều này?


10
Hãy thử Mockito.verify(mock, times(4)).send(). Tôi tự hỏi tại sao bạn "di chuyển" send()cuộc gọi phương thức bên trong verifyphương thức. Bạn đã có cú pháp đúng.
Tom


Cũng lưu ý rằng nếu bạn không quan tâm số lần gọi một cái gì đó, bạn có thể viếtverify(mock, atLeastOnce()).send();
Dawood ibn Kareem

Cảm ơn bạn, điều đó đúng. Điều tôi thấy khó hiểu là nó Mockito.verify(mock).send()đã qua nhưng chỉ gói gọn nó đã gây ra lỗi, điều này không thay đổi gì cả. Tuy nhiên, đó là một chiến thắng!
nbpeth

Câu trả lời:


237

Phương pháp cần thiết là Mockito # verify :

public static <T> T verify(T mock,
                           VerificationMode mode)

mocklà đối tượng bị chế giễu của bạn và modelà đối tượng VerificationModemô tả cách xác định giả. Các chế độ có thể là :

verify(mock, times(5)).someMethod("was called five times");
verify(mock, never()).someMethod("was never called");
verify(mock, atLeastOnce()).someMethod("was called at least once");
verify(mock, atLeast(2)).someMethod("was called at least twice");
verify(mock, atMost(3)).someMethod("was called at most 3 times");
verify(mock, atLeast(0)).someMethod("was called any number of times"); // useful with captors
verify(mock, only()).someMethod("no other method has been called on the mock");

Bạn sẽ cần các nhập khẩu tĩnh này từ Mockitolớp để sử dụng verifyphương thức và các chế độ xác minh sau:

import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

Vì vậy, trong trường hợp của bạn, cú pháp đúng sẽ là:

Mockito.verify(mock, times(4)).send()

Điều này xác minh rằng phương thức sendđược gọi 4 lần trên đối tượng bị chế giễu. Nó sẽ thất bại nếu nó được gọi ít hơn 4 lần.


Nếu bạn chỉ muốn kiểm tra, nếu phương thức đã được gọi một lần, thì bạn không cần phải vượt qua a VerificationMode. Một đơn giản

verify(mock).someMethod("was called once");

sẽ là đủ Nó sử dụng nội bộ verify(mock, times(1)).someMethod("was called once");.


Có thể có nhiều cuộc gọi xác minh trên cùng một giả để đạt được xác minh "giữa". Mockito không hỗ trợ những thứ như thế này verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");, nhưng chúng ta có thể viết

verify(mock, atLeast(4)).someMethod("was called at least four times ...");
verify(mock, atMost(6)).someMethod("... and not more than six times");

thay vào đó, để có được hành vi tương tự. Các giới hạn được bao gồm , vì vậy trường hợp thử nghiệm có màu xanh khi phương thức được gọi là 4, 5 hoặc 6 lần.


1
Đối với bất kỳ ai muốn tìm vị trí của các VerificationModephương thức (để nhập tĩnh hoặc tham chiếu rõ ràng), chúng nằm trong org.mockito.internal.verification.VerificationModeFactory.
Steve Chambers

verify(mock, atLeast(0)).someMethod("was called any number of times");là hữu ích để bỏ qua xác minh cuộc gọi
tj-recess

2
Có cái gì đó giống như verify(between(m,n))xác minh số lượng cuộc gọi giữa m và n?
Nishant

2
@ Vecant Không, Mockito dường như không hỗ trợ điều đó, nhưng bạn có thể gọi điện verifynhiều lần atLeast(M)atMost(n)để có được hành vi tương tự. Tôi đã chỉnh sửa câu trả lời giải thích rằng.
Tom

@KevinWelker Bạn nói đúng, tôi đã xóa thông tin về VerificationModeFactory. Nó vẫn có sẵn trong phiên bản mới nhất, nhưng tôi đồng ý rằng các lớp bên trong không nên được sử dụng.
Tom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.