ตั้งแต่ Java 8 คุณสามารถใช้anyวิธีการที่ไม่มีข้อโต้แย้งและอาร์กิวเมนต์ประเภทจะได้รับการสรุปโดยคอมไพเลอร์:
verify(bar).doStuff(any());
คำอธิบาย
สิ่งใหม่ใน Java 8 คือประเภทเป้าหมายของนิพจน์จะถูกใช้เพื่ออนุมานพารามิเตอร์ประเภทของนิพจน์ย่อย ก่อนหน้า Java 8 จะแย้งกับวิธีที่ใช้สำหรับการอนุมานพารามิเตอร์ชนิด (ส่วนใหญ่)
ในกรณีนี้ประเภทพารามิเตอร์ของdoStuffจะเป็นประเภทเป้าหมายสำหรับany()และประเภทค่าตอบแทนของany()จะได้รับเลือกให้ตรงกับประเภทอาร์กิวเมนต์นั้น
กลไกนี้ถูกเพิ่มใน Java 8 เป็นหลักเพื่อให้สามารถรวบรวมแลมบ์ดานิพจน์ได้ แต่ส่วนใหญ่จะปรับปรุงการอนุมานประเภทโดยทั่วไป
ประเภทดั้งเดิม
วิธีนี้ใช้ไม่ได้กับประเภทดั้งเดิม แต่น่าเสียดายที่:
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
ปัญหาคือว่าคอมไพเลอร์จะสรุปเป็นค่าตอบแทนของInteger any()Mockito จะไม่ตระหนักถึงเรื่องนี้ (เนื่องจากการลบออกประเภท) nullและกลับค่าเริ่มต้นสำหรับประเภทการอ้างอิงซึ่งเป็น รันไทม์จะพยายามยกเลิกการส่งคืนค่าโดยเรียกintValueเมธอดนั้นก่อนส่งผ่านไปยังdoStuffและข้อยกเว้นจะถูกส่งออกไป
anyวิธีการนี้ควรใช้งานได้ คุณไม่ต้องค้นหาคำตอบสำหรับสิ่งที่ใช้งานได้!