Pilihan lain adalah mengandalkan equals
metode mode lama yang bagus . Selama argumen dalam when
mock equals
argumen dalam kode yang diuji, maka Mockito akan cocok dengan mock.
Berikut ini sebuah contoh.
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 );
}
}
kemudian, dengan anggapan Anda tahu berapa nilainya someField
, Anda dapat mengejeknya seperti ini.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
pro: Ini lebih eksplisit daripada any
pencocokan. Sebagai peninjau kode, saya tetap membuka mata any
dalam kode yang ditulis pengembang junior, karena melirik logika kode mereka untuk menghasilkan objek yang sesuai yang dilewatkan.
con: Terkadang bidang yang diteruskan ke objek adalah ID acak. Untuk kasus ini, Anda tidak dapat dengan mudah membuat objek argumen yang diharapkan dalam kode tiruan Anda.
Pendekatan lain yang mungkin adalah dengan menggunakan objek Mockito Answer
yang dapat digunakan dengan when
metode ini. Answer
memungkinkan Anda mencegat panggilan aktual dan memeriksa argumen input dan mengembalikan objek tiruan. Dalam contoh di bawah ini saya menggunakan any
untuk menangkap permintaan apa pun untuk metode yang diejek. Tapi kemudian di Answer
lambda, saya dapat memeriksa argumen Bazo lebih lanjut ... mungkin untuk memverifikasi bahwa ID yang tepat diberikan padanya. Saya lebih suka ini daripada any
dengan sendirinya sehingga setidaknya beberapa inspeksi dilakukan pada argumen.
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;
} );
Jadi untuk meringkas semuanya, saya suka mengandalkan equals
(di mana argumen yang diharapkan dan argumen yang sebenarnya harus sama satu sama lain) dan jika persamaan tidak mungkin (karena tidak dapat memprediksi keadaan argumen yang sebenarnya), saya akan menggunakan untuk Answer
memeriksa argumen.