ข้อเสนอ Mockito:
when(mock.process(Matchers.any(List.class)));
จะหลีกเลี่ยงคำเตือนได้อย่างไรหากprocess
ใช้List<Bar>
แทน
ข้อเสนอ Mockito:
when(mock.process(Matchers.any(List.class)));
จะหลีกเลี่ยงคำเตือนได้อย่างไรหากprocess
ใช้List<Bar>
แทน
คำตอบ:
สำหรับ Java 8 ขึ้นไปมันง่าย:
when(mock.process(Matchers.anyList()));
สำหรับ Java 7 และต่ำกว่าคอมไพเลอร์ต้องการความช่วยเหลือเล็กน้อย การใช้anyListOf(Class<T> clazz)
:
when(mock.process(Matchers.anyListOf(Bar.class)));
anyListOf
ดีกว่าที่จะใช้ แม้ว่าจะใช้anyList
งานได้แต่ก็ส่งเสียงเตือน
anyListOf
เลิกใช้แล้วดังนั้นจะดีกว่าที่จะไม่ใช้ ตัวอย่างสำหรับ Java 8 ไม่ทำงานในกรณีที่เมธอดโอเวอร์โหลดตัวอย่างเช่นถ้าคุณมีวิธีรับ 2 รายการที่แตกต่างกัน: List<DBEntity>
และList<DTO>
ฉันได้แก้ไขปัญหานี้โดยใช้ArgumentMatchers
กับ generic:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
นอกเหนือจากanyListOf
ข้างต้นคุณสามารถระบุ generics อย่างชัดเจนโดยใช้ไวยากรณ์นี้:
when(mock.process(Matchers.<List<Bar>>any(List.class)));
Java 8 อนุญาตการอนุมานชนิดใหม่ตามพารามิเตอร์ดังนั้นหากคุณใช้ Java 8 สิ่งนี้อาจใช้ได้เช่นกัน
when(mock.process(Matchers.any()));
โปรดจำไว้ว่าค่าany()
มิได้anyList()
จะใช้การตรวจสอบใด ๆ รวมทั้งประเภทหรือ null การตรวจสอบ ใน Mockito 2.x any(Foo.class)
เปลี่ยนเป็นหมายถึง "any instanceof
Foo" แต่any()
ยังคงหมายถึง "ค่าใด ๆ รวมถึงnull
"
หมายเหตุ: ข้างต้นได้เปลี่ยนไปArgumentMatchersในรุ่นใหม่ของ Mockito org.hamcrest.Matchers
เพื่อหลีกเลี่ยงการปะทะกันกับชื่อ Mockito เวอร์ชันเก่าจะต้องใช้ต่อorg.mockito.Matchers
ไป
Matchers.any()
สะดวกมาก!
ก่อน Java 8 (เวอร์ชัน 7 หรือ 6) ฉันใช้วิธีการใหม่ ArgumentMatchers.anyList:
import static org.mockito.Mockito.*;
import org.mockito.ArgumentMatchers;
verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());