Vì Java 8, bạn có thể sử dụng any
phương thức không có đối số và đối số kiểu sẽ được trình biên dịch suy ra:
verify(bar).doStuff(any());
Giải trình
Điều mới trong Java 8 là kiểu đích của một biểu thức sẽ được sử dụng để suy ra các tham số kiểu của các biểu thức con của nó. Trước Java 8 chỉ đối số với các phương thức được sử dụng cho suy luận tham số kiểu (hầu hết thời gian).
Trong trường hợp này, loại tham số doStuff
sẽ là loại mục tiêu any()
và loại giá trị trả về any()
sẽ được chọn để khớp với loại đối số đó.
Cơ chế này đã được thêm vào trong Java 8 chủ yếu để có thể biên dịch các biểu thức lambda, nhưng nó cải thiện suy luận kiểu nói chung.
Các loại nguyên thủy
Điều này không hoạt động với các loại nguyên thủy, không may:
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
Vấn đề là trình biên dịch sẽ suy ra Integer
giá trị trả về của any()
. Mockito sẽ không nhận thức được điều này (do loại xóa) và trả về giá trị mặc định cho các loại tham chiếu null
. Thời gian chạy sẽ cố gắng bỏ hộp giá trị trả về bằng cách gọi intValue
phương thức trên nó trước khi chuyển đến doStuff
và ngoại lệ được đưa ra.
any
phương thức này chỉ hoạt động. Bạn không tìm kiếm câu trả lời cho những thứ chỉ hoạt động!