Mockito.any () ผ่านส่วนต่อประสานกับ Generics


171

เป็นไปได้ที่จะผ่านประเภทของอินเตอร์เฟซที่มี generics หรือไม่?

อินเทอร์เฟซ:

public interface AsyncCallback<T>

ในวิธีทดสอบของฉัน:

Mockito.any(AsyncCallback.class)

วาง<ResponseX>ไว้ด้านหลังหรือ.classไม่ทำงาน

คำตอบ:


306

มีวิธีที่ปลอดภัยประเภทคือ: ใช้ArgumentMatchers.any()และรับรองด้วยประเภท:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
ฉันยืนยันคำตอบนี้ใช้งานได้และระงับคำเตือนอย่างถูกต้อง
kevinarpe

1
วิธีนี้ไม่ปลอดภัยกว่าจริงๆเนื่องจากวิธีการจริงสามารถเรียกได้ด้วยอาร์กิวเมนต์ที่พิมพ์อย่างถูกต้องเท่านั้น มันเป็นสิ่งที่จำเป็นในการทำให้คอมไพเลอร์ pre-java8 ที่ขาดการอนุมานประเภทนี้
เฮอร์แมน

ฉันใช้สิ่งนี้เช่น ResponseEntity <List <Map <String, Object >>> responseEntity = Matchers. <ResponseEntity <List <Map <Map <String, Object >>>> any (); และจะส่งคืนค่าว่างเสมอ
Arun

6
ด้วย Mockito เวอร์ชันใหม่:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchersเลิกใช้จริง แต่ArgumentMatchersทำงานได้
guijob

67

การใช้ Java 8 คุณสามารถใช้any()(สมมติว่าการอิมพอร์ตแบบสแตติก) โดยไม่มีอาร์กิวเมนต์หรือพารามิเตอร์ชนิดเนื่องจากการอนุมานชนิดที่ปรับปรุงแล้ว คอมไพเลอร์ทราบจากประเภทเป้าหมาย (ชนิดของอาร์กิวเมนต์เมธอด) ที่คุณหมายถึงจริงMatchers.<AsyncCallback<ResponseX>>any()ซึ่งเป็นโซลูชัน pre-Java 8


จะไม่any()ตรงกันAsyncCallback<AnyOtherType>เช่นกัน?
Matthew อ่าน

@MatthewRead การใช้AsyncCallback<AnyOtherType>ไม่ควรคอมไพล์แม้แต่ถ้าอาร์กิวเมนต์ประเภทคือ 'AsyncCallback <ResponseX>'
เฮอร์แมน

1
ฉันสงสัยเกี่ยวกับสถานการณ์ที่ประเภทอาร์กิวเมนต์เป็นแบบทั่วไปเช่นกัน แต่คุณเพียงแค่ต้องการเยาะเย้ยมันสำหรับประเภทคอนกรีตหนึ่งประเภท (หรือจำลองด้วยรูปแบบที่หลากหลายในรูปแบบที่แตกต่างกัน) ป.ร. ให้ไว้when(x.y(any())).thenAnswer(...)เช่นที่เป็นy public <T> T y(AsyncCallback<T> arg)บางทีอาจเป็นการดีกว่าที่จะตรวจสอบประเภทของคำตอบหากเป็นสิ่งที่จำเป็น?
Matthew อ่าน

2
@MatthewRead เนื่องจากการลบประเภท Mockito จะไม่สามารถตรวจสอบชนิดที่แท้จริงได้ isA()ดังนั้นคุณจึงไม่สามารถแม้แต่จะใช้ หากวัตถุนั้นถือClassวัตถุที่ตรงกับประเภทและอินเทอร์เฟซเปิดเผยสิ่งนี้ฉันเดาว่าคุณสามารถตรวจสอบได้ใน matcher ที่กำหนดเอง หรือตัวอย่างเช่นในกรณีของCollectionคุณสามารถตรวจสอบประเภทขององค์ประกอบ
เฮอร์แมน

1
Matchersถูกแทนที่ด้วยArgumentMatchersใน Mockito v2
bheussler

15

ฉันต้องยอมรับกลไกต่อไปนี้เพื่ออนุญาตให้ generics:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

หวังว่านี่จะช่วยใครซักคน


3
ดูคำตอบของฉัน: นี่ไม่จำเป็นกับ Java 8 อีกต่อไป
herman

5

การโพสต์ความคิดเห็น pierrefevrier เป็นคำตอบซึ่งอาจมีประโยชน์หากมันแสดงในคำตอบแทนที่จะเป็นความคิดเห็น

ด้วย Mockito เวอร์ชันใหม่: (Matchers.<AsyncCallback<ResponseX>>any()


1
ฉันเพิ่มความคิดเห็นของเขาในคำตอบเดิม
Joergi

2

ยิ่งกว่านั้นคำตอบของ thSoft ทำให้การเรียกที่ผ่านการรับรองไปยัง () ด้วยวิธีใดหมายถึงฉันสามารถลบการรับรองได้เนื่องจากประเภทการส่งคืนที่ได้รับอนุญาตอนุมาน:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

คุณสามารถส่งได้โดยเพิ่มคำเตือนหากคุณต้องการ:

@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.
kevinarpe

ไม่ใช่ความคิดที่ดีที่จะใช้@SuppressWarnings: pre-java 8 ถ้าคุณจะกำหนดให้กับตัวแปรที่แยกจากกันคุณสามารถใช้any()คำตอบของพวกมันได้ ขณะนี้มี java 8 any()สามารถใช้แบบอินไลน์ได้โดยไม่จำเป็นต้องมีการมอบหมายแยกต่างหาก
เฮอร์แมน

@kevinarpe หากคุณมีผู้โต้แย้งหลายคนพวกเขาจะต้องถูกเรียกตามลำดับเนื่องจากภาษาจาวาระบุไว้
TWiStErRob

0

ฉันมีปัญหาคล้ายกันในการใช้สปริงExample:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

ที่นี่คุณจะต้องใช้วุฒิการศึกษา, B / C findall วิธีสามารถใช้หลายประเภทเช่นและSort Iterableนอกจากนี้คุณยังสามารถใช้Mockito.any(Example.class)แน่นอนพร้อมคำเตือนความปลอดภัยประเภท

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.