Câu trả lời:
Đối với Java 8 trở lên, thật dễ dàng:
when(mock.process(Matchers.anyList()));
Đối với Java 7 trở xuống, trình biên dịch cần một chút trợ giúp. Sử dụng anyListOf(Class<T> clazz)
:
when(mock.process(Matchers.anyListOf(Bar.class)));
anyListOf
. Mặc dù anyList
hoạt động, nó phát ra một cảnh báo.
anyListOf
không được dùng nữa, vì vậy tốt hơn là KHÔNG sử dụng nó. Ví dụ cho Java 8 không hoạt động trong trường hợp quá tải phương thức, ví dụ: nếu bạn có một phương thức chấp nhận 2 danh sách khác nhau: List<DBEntity>
và List<DTO>
tôi đã giải quyết vấn đề này bằng cách sử dụng ArgumentMatchers
chung:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
Ngoài ra anyListOf
, bạn luôn có thể chỉ định rõ ràng khái quát bằng cách sử dụng cú pháp này:
when(mock.process(Matchers.<List<Bar>>any(List.class)));
Java 8 mới cho phép suy luận kiểu dựa trên các tham số, vì vậy nếu bạn đang sử dụng Java 8, điều này cũng có thể hoạt động:
when(mock.process(Matchers.any()));
Hãy nhớ rằng không any()
hoặc cũng anyList()
sẽ không áp dụng bất kỳ kiểm tra nào, kể cả kiểm tra loại hoặc null. Trong Mockito 2.x, any(Foo.class)
đã được thay đổi thành "bất kỳ instanceof
Foo" nào, nhưng any()
vẫn có nghĩa là "mọi giá trị bao gồm null
".
LƯU Ý: Phần trên đã chuyển sang ArgumentMatchers trong các phiên bản mới hơn của Mockito, để tránh xung đột tên với org.hamcrest.Matchers
. Các phiên bản cũ hơn của Mockito sẽ cần tiếp tục sử dụng org.mockito.Matchers
như trên.
Matchers.any()
rất tiện lợi
Trước Java 8 (phiên bản 7 hoặc 6) tôi sử dụng phương thức mới ArgumentMatchers.anyList:
import static org.mockito.Mockito.*;
import org.mockito.ArgumentMatchers;
verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());