เป็นไปได้ที่จะผ่านประเภทของอินเตอร์เฟซที่มี generics หรือไม่?
อินเทอร์เฟซ:
public interface AsyncCallback<T>
ในวิธีทดสอบของฉัน:
Mockito.any(AsyncCallback.class)
วาง<ResponseX>
ไว้ด้านหลังหรือ.class
ไม่ทำงาน
เป็นไปได้ที่จะผ่านประเภทของอินเตอร์เฟซที่มี generics หรือไม่?
อินเทอร์เฟซ:
public interface AsyncCallback<T>
ในวิธีทดสอบของฉัน:
Mockito.any(AsyncCallback.class)
วาง<ResponseX>
ไว้ด้านหลังหรือ.class
ไม่ทำงาน
คำตอบ:
มีวิธีที่ปลอดภัยประเภทคือ: ใช้ArgumentMatchers.any()
และรับรองด้วยประเภท:
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
เลิกใช้จริง แต่ArgumentMatchers
ทำงานได้
การใช้ Java 8 คุณสามารถใช้any()
(สมมติว่าการอิมพอร์ตแบบสแตติก) โดยไม่มีอาร์กิวเมนต์หรือพารามิเตอร์ชนิดเนื่องจากการอนุมานชนิดที่ปรับปรุงแล้ว คอมไพเลอร์ทราบจากประเภทเป้าหมาย (ชนิดของอาร์กิวเมนต์เมธอด) ที่คุณหมายถึงจริงMatchers.<AsyncCallback<ResponseX>>any()
ซึ่งเป็นโซลูชัน pre-Java 8
any()
ตรงกันAsyncCallback<AnyOtherType>
เช่นกัน?
AsyncCallback<AnyOtherType>
ไม่ควรคอมไพล์แม้แต่ถ้าอาร์กิวเมนต์ประเภทคือ 'AsyncCallback <ResponseX>'
when(x.y(any())).thenAnswer(...)
เช่นที่เป็นy
public <T> T y(AsyncCallback<T> arg)
บางทีอาจเป็นการดีกว่าที่จะตรวจสอบประเภทของคำตอบหากเป็นสิ่งที่จำเป็น?
isA()
ดังนั้นคุณจึงไม่สามารถแม้แต่จะใช้ หากวัตถุนั้นถือClass
วัตถุที่ตรงกับประเภทและอินเทอร์เฟซเปิดเผยสิ่งนี้ฉันเดาว่าคุณสามารถตรวจสอบได้ใน matcher ที่กำหนดเอง หรือตัวอย่างเช่นในกรณีของCollection
คุณสามารถตรวจสอบประเภทขององค์ประกอบ
Matchers
ถูกแทนที่ด้วยArgumentMatchers
ใน Mockito v2
ฉันต้องยอมรับกลไกต่อไปนี้เพื่ออนุญาตให้ generics:
import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);
หวังว่านี่จะช่วยใครซักคน
การโพสต์ความคิดเห็น pierrefevrier เป็นคำตอบซึ่งอาจมีประโยชน์หากมันแสดงในคำตอบแทนที่จะเป็นความคิดเห็น
ด้วย Mockito เวอร์ชันใหม่: (Matchers.<AsyncCallback<ResponseX>>any()
ยิ่งกว่านั้นคำตอบของ thSoft ทำให้การเรียกที่ผ่านการรับรองไปยัง () ด้วยวิธีใดหมายถึงฉันสามารถลบการรับรองได้เนื่องจากประเภทการส่งคืนที่ได้รับอนุญาตอนุมาน:
private HashMap<String, String> anyStringStringHashMap() {
return Matchers.any();
}
คุณสามารถส่งได้โดยเพิ่มคำเตือนหากคุณต้องการ:
@SuppressWarnings("unchecked")
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)
หาก Java อนุญาตให้ใช้ชื่อสามัญ 'ทั่วไป' พวกเขาอาจมีวิธีการเช่นนี้ซึ่งเป็นสิ่งที่คุณกำลังมองหา
private static <T, E> T<E> mock(Class<T<E>> clazz)
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: pre-java 8 ถ้าคุณจะกำหนดให้กับตัวแปรที่แยกจากกันคุณสามารถใช้any()
คำตอบของพวกมันได้ ขณะนี้มี java 8 any()
สามารถใช้แบบอินไลน์ได้โดยไม่จำเป็นต้องมีการมอบหมายแยกต่างหาก
ฉันมีปัญหาคล้ายกันในการใช้สปริงExample
:
Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
.thenReturn(Lists.emptyList());
ที่นี่คุณจะต้องใช้วุฒิการศึกษา, B / C findall วิธีสามารถใช้หลายประเภทเช่นและSort
Iterable
นอกจากนี้คุณยังสามารถใช้Mockito.any(Example.class)
แน่นอนพร้อมคำเตือนความปลอดภัยประเภท