Saya memiliki kode seperti ini di bawah ini:
Class A {
public boolean myMethod(someargs) {
MyQueryClass query = new MyQueryClass();
Long id = query.getNextId();
// some more code
}
}
Class MyQueryClass {
....
public Long getNextId() {
//lot of DB code, execute some DB query
return id;
}
}
Sekarang saya sedang menulis tes untuk A.myMethod(someargs)
. Saya ingin melewatkan metode sebenarnya query.getNextId()
dan sebagai gantinya mengembalikan nilai rintisan. Pada dasarnya, saya ingin mengejek MyQueryClass
.
Jadi dalam kasus uji saya, saya telah menggunakan:
MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);
boolean b = A.getInstance().myMethod(args);
//asserts
Saya menggunakan @RunWith(PowerMockRunner.class)
dan @PrepareForTest({MyQueryClass.class})
di awal kelas pengujian saya.
Tapi ketika saya debug tes, masih memanggil metode nyata getNextId()
dari MyQueryClass
kelas.
Apa yang kulewatkan di sini? Adakah yang bisa membantu karena saya baru mengenal Mockito dan PowerMockito.
Seperti yang disebutkan @TrueDub dalam balasannya yang diterima, Anda perlu menambahkan kelas tempat konstruktor dipanggil ke
@PrepareForTest
.Namun, jika Anda melakukan ini, cakupan untuk kelas itu seperti yang dilaporkan oleh eclemma dan Sonar akan menjadi nol untuk kelas itu
Wiki Powermockito
Jadi solusinya di sini adalah memfaktorkan ulang kode sebenarnya untuk menggunakan pabrik statis yang akan mengembalikan instance kelas itu dan kemudian secara statis memalsukannya.
sumber
Mungkin Anda bisa langsung menggunakan
sumber