argThat
cộng với lambda
đó là cách bạn có thể không xác minh đối số của mình:
verify(mock).mymethod(argThat(
(x)->false
));
Ở đâu
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
cộng với khẳng định
bài kiểm tra trên sẽ "nói" Expected: lambda$... Was: YourClass.toSting...
. Bạn có thể nhận được một nguyên nhân cụ thể hơn của sự thất bại nếu sử dụng các xác nhận trong lambda:
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
NHƯNG: CHỈ CÓ CÔNG TRÌNH NÀY VỚI 1 PHƯƠNG PHÁP GỌI. Nếu phương thức được xác minh được gọi là hơn 2 lần, mockito sẽ chuyển tất cả các kết hợp được gọi cho mỗi trình xác minh. Vì vậy, mockito mong đợi trình xác minh của bạn âm thầm trả về true
một trong các đối số được đặt và false
(không có ngoại lệ khẳng định) cho các cuộc gọi hợp lệ khác. Sự mong đợi đó không phải là vấn đề đối với 1 cuộc gọi phương thức - nó sẽ chỉ trả về đúng 1 lần.
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
Bây giờ kiểm tra nói : Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. LƯU Ý: Tôi đã sử dụng các assertJ
xác nhận, nhưng tùy thuộc vào bạn sử dụng khung xác nhận nào.
argThat
với nhiều đối số.
Nếu bạn sử dụng argThat
, tất cả các đối số phải được cung cấp với kết quả khớp. Ví dụ:
verify(mock).mymethod(eq("VALUE_1"), argThat((x)->false));
// above is correct as eq() is also an argument matcher.
verify(mock).mymethod("VALUE_1", argThat((x)->false));
// above is incorrect; an exceptoin will be thrown, as the fist arg. is given without an argument matcher.
Ở đâu:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
diêm
cách dễ nhất để kiểm tra xem đối số có bằng nhau không:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
tranh luận trực tiếp
nếu so sánh bằng ref là chấp nhận được, thì hãy tiếp tục với:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
NGUYÊN NHÂN ROOT của thất bại câu hỏi ban đầu là vị trí sai của câu hỏi : verify(mock.mymethod...
. Điều đó không đúng. Quyền sẽ là:verify(mock).*