คำตอบของ Tomasz Nurkiewicz ดูเหมือนจะไม่บอกเรื่องราวทั้งหมด!
รุ่น NB Mockito: 1.10.19
ฉันเป็น Mockito newb เป็นอย่างมากดังนั้นจึงไม่สามารถอธิบายพฤติกรรมดังต่อไปนี้: หากมีผู้เชี่ยวชาญที่สามารถปรับปรุงคำตอบนี้ได้โปรดอย่าลังเล
วิธีการในคำถามที่นี่ที่getContentStringValueเป็นไม่ได้ finalและไม่ได้ static
บรรทัดนี้เรียกวิธีการเดิมgetContentStringValue:
doReturn( "dummy" ).when( im ).getContentStringValue( anyInt(), isA( ScoreDoc.class ));
บรรทัดนี้ไม่ได้เรียกวิธีการเดิมgetContentStringValue:
doReturn( "dummy" ).when( im ).getContentStringValue( anyInt(), any( ScoreDoc.class ));
สำหรับเหตุผลที่ฉันไม่สามารถตอบได้การใช้isA()ทำให้พฤติกรรมที่ตั้งใจ (?) "ไม่เรียกใช้เมธอด" ของที่doReturnจะล้มเหลว
ดู Let 's ที่ลายเซ็นวิธีการที่เกี่ยวข้องกับที่นี่: พวกเขาเป็นทั้งวิธีการstatic Matchersทั้งคู่กล่าวโดย Javadoc ที่จะกลับมาnullซึ่งเป็นเรื่องยากเล็กน้อยที่จะนำพาคุณไปรอบ ๆ สันนิษฐานว่าClassวัตถุที่ส่งผ่านขณะที่พารามิเตอร์ถูกตรวจสอบ แต่ผลลัพธ์ไม่เคยถูกคำนวณหรือทิ้ง ระบุว่าnullสามารถยืนสำหรับการเรียนใด ๆ และที่คุณกำลังหวังสำหรับวิธีการเยาะเย้ยไม่ได้ที่จะเรียกว่าไม่สามารถลงลายมือชื่อผู้isA( ... )และany( ... )เพียงแค่กลับมาnullแทนที่จะเป็นพารามิเตอร์ทั่วไป * <T>?
อย่างไรก็ตาม:
public static <T> T isA(java.lang.Class<T> clazz)
public static <T> T any(java.lang.Class<T> clazz)
เอกสาร API ไม่ได้ให้เงื่อนงำใด ๆ เกี่ยวกับเรื่องนี้ นอกจากนี้ยังดูเหมือนว่าต้องการพฤติกรรมดังกล่าว "ไม่เรียกวิธี" คือ "หายากมาก" โดยส่วนตัวแล้วฉันใช้เทคนิคนี้ตลอดเวลา : โดยทั่วไปแล้วฉันพบว่าการเยาะเย้ยนั้นเกี่ยวข้องกับสองสามบรรทัดที่ "กำหนดฉาก" ... ตามด้วยการเรียกวิธีการที่ "เล่น" ฉากในบริบทจำลองซึ่งคุณแสดงไว้ .. และในขณะที่คุณกำลังจัดฉากและอุปกรณ์ประกอบฉากสิ่งสุดท้ายที่คุณต้องการคือให้นักแสดงเข้าสู่เวทีด้านซ้ายและเริ่มแสดงหัวใจของพวกเขาออกไป ...
แต่นี่เป็นวิธีที่เกินระดับการจ่ายเงินของฉัน ... ฉันเชิญคำอธิบายจากมหาปุโรหิต Mockito ที่ผ่านมา ...
* คือ "พารามิเตอร์ทั่วไป" เป็นคำที่ถูกต้องหรือไม่