อีกทางเลือกหนึ่งคือการพึ่งพาequals
วิธีการแบบเก่าที่ดี ตราบใดที่การโต้แย้งในการwhen
จำลองequals
การโต้แย้งในรหัสที่ถูกทดสอบแล้ว Mockito จะตรงกับการเยาะเย้ย
นี่คือตัวอย่าง
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
จากนั้นสมมติว่าคุณรู้ว่าค่าที่ต้องการsomeField
คืออะไรคุณสามารถเยาะเย้ยเช่นนี้
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
ข้อดี: นี่คือชัดเจนมากขึ้นแล้วany
matchers ในฐานะผู้ตรวจทานโค้ดฉันเปิดตาไว้any
ในโค้ดผู้พัฒนารุ่นใหม่เพราะมันจ้องมองตรรกะของรหัสเพื่อสร้างวัตถุที่เหมาะสมที่ถูกส่งผ่าน
con: บางครั้งสนามที่ถูกส่งผ่านไปยังวัตถุนั้นเป็นรหัสสุ่ม สำหรับกรณีนี้คุณไม่สามารถสร้างวัตถุอาร์กิวเมนต์ที่คาดไว้ในรหัสจำลองได้อย่างง่ายดาย
อีกวิธีที่เป็นไปได้คือการใช้Answer
วัตถุของ Mockito ที่สามารถใช้ได้กับwhen
วิธีการนั้น Answer
ช่วยให้คุณตัดการโทรที่เกิดขึ้นจริงและตรวจสอบอาร์กิวเมนต์อินพุตและส่งคืนวัตถุจำลอง ในตัวอย่างด้านล่างฉันใช้any
เพื่อจับการร้องขอใด ๆ กับวิธีที่ถูกเยาะเย้ย แต่ในAnswer
แลมบ์ดาฉันสามารถตรวจสอบข้อโต้แย้ง Bazo เพิ่มเติม ... อาจจะตรวจสอบว่ามีการส่ง ID ที่ถูกต้องไปให้ ฉันชอบสิ่งนี้มากกว่าany
ด้วยตัวเองเพื่อให้การตรวจสอบอย่างน้อยมีการโต้แย้ง
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
ดังนั้นเพื่อสรุปทั้งหมดฉันชอบอาศัยequals
(ที่อาร์กิวเมนต์ที่คาดไว้และอาร์กิวเมนต์ที่แท้จริงควรจะเท่ากับแต่ละอื่น ๆ ) และถ้าไม่เท่ากับ (ไม่สามารถทำนายสถานะของอาร์กิวเมนต์ที่แท้จริง) ฉันจะ เพื่อAnswer
ตรวจสอบข้อโต้แย้ง