Saya mendapatkan pengecualian berikut saat menjalankan tes. Saya menggunakan Mockito untuk mengejek. Petunjuk yang disebutkan oleh perpustakaan Mockito tidak membantu.
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at com.a.b.DomainTestFactory.myTest(DomainTestFactory.java:355)
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!
at a.b.DomainTestFactory.myTest(DomainTestFactory.java:276)
..........
Kode Uji dari DomainTestFactory
. Ketika saya menjalankan tes berikut, saya melihat pengecualian.
@Test
public myTest(){
MyMainModel mainModel = Mockito.mock(MyMainModel.class);
Mockito.when(mainModel.getList()).thenReturn(getSomeList()); // Line 355
}
private List<SomeModel> getSomeList() {
SomeModel model = Mockito.mock(SomeModel.class);
Mockito.when(model.getName()).thenReturn("SomeName"); // Line 276
Mockito.when(model.getAddress()).thenReturn("Address");
return Arrays.asList(model);
}
public class SomeModel extends SomeInputModel{
protected String address;
protected List<SomeClass> properties;
public SomeModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
public String getAddress() {
return this.address;
}
}
public class SomeInputModel{
public NetworkInputModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
protected String Name;
protected List<SomeClass> properties;
public String getName() {
return this.Name;
}
public void setName(String value) {
this.Name = value;
}
}
Jawaban:
Anda bersarang mengejek bagian dalam mengejek. Anda menelepon
getSomeList()
, yang melakukan beberapa ejekan, sebelum Anda selesai mengejeknyaMyMainModel
. Mockito tidak suka kalau kamu melakukan ini.Menggantikan
dengan
Untuk memahami mengapa ini menyebabkan masalah, Anda perlu tahu sedikit tentang cara kerja Mockito, dan juga harus mengetahui bagaimana ekspresi dan pernyataan pesanan dievaluasi di Jawa.
Mockito tidak dapat membaca kode sumber Anda, jadi untuk mengetahui apa yang Anda minta lakukan, itu banyak bergantung pada keadaan statis. Ketika Anda memanggil metode pada objek tiruan, Mockito mencatat rincian panggilan dalam daftar doa internal. The
when
metode membaca yang terakhir dari doa tersebut dari daftar dan mencatat doa ini dalamOngoingStubbing
objek itu kembali.Garis
menyebabkan interaksi berikut dengan Mockito:
mainModel.getList()
disebut,when
disebut,thenReturn
dipanggil padaOngoingStubbing
objek yang dikembalikan olehwhen
metode.The
thenReturn
Metode kemudian dapat menginstruksikan mock itu diterima melaluiOngoingStubbing
metode untuk menangani setiap panggilan sesuai dengangetList
metode untuk kembalisomeModelList
.Bahkan, karena Mockito tidak dapat melihat kode Anda, Anda juga dapat menulis mengejek Anda sebagai berikut:
Gaya ini agak kurang jelas untuk dibaca, terutama karena dalam kasus
null
ini harus dicetak, tetapi menghasilkan urutan interaksi yang sama dengan Mockito dan akan mencapai hasil yang sama seperti baris di atas.Namun, garisnya
menyebabkan interaksi berikut dengan Mockito:
mainModel.getList()
disebut,when
disebut,mock
dariSomeModel
diciptakan (di dalamgetSomeList()
),model.getName()
disebut,Pada titik ini Mockito menjadi bingung. Sepertinya Anda mengejek
mainModel.getList()
, tetapi sekarang Anda mengatakan bahwa Anda ingin mengejekmodel.getName()
metodenya. Untuk Mockito, sepertinya Anda melakukan hal berikut:Ini terlihat konyol
Mockito
karena tidak yakin dengan apa yang Anda lakukanmainModel.getList()
.Perhatikan bahwa kami tidak sampai ke
thenReturn
pemanggilan metode, karena JVM perlu mengevaluasi parameter untuk metode ini sebelum dapat memanggil metode. Dalam hal ini, ini berarti memanggilgetSomeList()
metode.Secara umum itu adalah keputusan desain yang buruk untuk bergantung pada keadaan statis, seperti yang dilakukan Mockito, karena itu dapat menyebabkan kasus-kasus di mana Prinsip Least Astonishment dilanggar. Namun, desain Mockito memang membuat ejekan yang jelas dan ekspresif, meskipun kadang-kadang membuat orang tercengang.
Akhirnya, versi terbaru dari Mockito menambahkan baris tambahan ke pesan kesalahan di atas. Baris tambahan ini menunjukkan Anda mungkin berada dalam situasi yang sama dengan pertanyaan ini:
sumber
Untuk mengejek metode batal, coba di bawah ini:
sumber