เป็นไปได้ที่จะผ่านประเภทของอินเตอร์เฟซที่มี 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)แน่นอนพร้อมคำเตือนความปลอดภัยประเภท