ตั้งแต่ 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
วิธีการนี้ควรใช้งานได้ คุณไม่ต้องค้นหาคำตอบสำหรับสิ่งที่ใช้งานได้!