Saya tidak beruntung mendapatkan Mockito untuk menangkap nilai argumen fungsi! Saya mengejek indeks mesin pencari dan alih-alih membuat indeks, saya hanya menggunakan hash.
// Fake index for solr
Hashmap<Integer,Document> fakeIndex;
// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);
// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
Saya tidak dapat menggunakan argumen sewenang-wenang karena saya sedang menguji hasil kueri (yaitu dokumen mana yang dikembalikan). Demikian juga, saya tidak ingin menentukan nilai tertentu dan memiliki garis untuk setiap dokumen!
Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))
Saya melihat bagian panggilan balik di halaman Menggunakan Mockito . Sayangnya, ini bukan Java dan saya tidak bisa mendapatkan interpretasi saya sendiri tentang itu untuk bekerja di Java.
EDIT (untuk klarifikasi): Bagaimana cara membuat Mockito menangkap argumen X dan meneruskannya ke fungsi saya? Saya ingin nilai pasti (atau ref) dari X diteruskan ke fungsi.
Saya tidak ingin menghitung semua kasus, dan argumen sewenang-wenang tidak akan berfungsi karena saya menguji hasil yang berbeda untuk kueri yang berbeda.
Halaman Mockito mengatakan
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
Itu bukan java, dan saya tidak tahu cara menerjemahkan ke dalam java atau meneruskan apa pun yang terjadi menjadi suatu fungsi.
sumber
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
harus menyiapkan objek tiruan untuk Anda. Apa yang terjadi saat Anda meneleponreader.document(666)
?Jawaban:
Saya tidak pernah menggunakan Mockito, tetapi ingin belajar, jadi ini dia. Jika seseorang yang kurang mengerti dariku menjawab, coba jawaban mereka dulu!
Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() { public Object answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); Object mock = invocation.getMock(); return document(fakeIndex((int)(Integer)args[0])); } });
sumber
Lihat ArgumentCaptors:
https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class); Mockito.when(reader.document(argument.capture())).thenAnswer( new Answer() { Object answer(InvocationOnMock invocation) { return document(argument.getValue()); } });
sumber
ArgumentCaptor
s untuk stubbing. Ada peringatan besar tentang itu di tautan itu. Lanjutkan dengan hati hati.Anda mungkin ingin menggunakan verifikasi () dalam kombinasi dengan ArgumentCaptor untuk memastikan eksekusi dalam pengujian dan ArgumentCaptor untuk mengevaluasi argumen:
Nilai argumen jelas dapat diakses melalui argument.getValue () untuk manipulasi / pemeriksaan lebih lanjut atau apa pun yang ingin Anda lakukan.
sumber
Dengan Java 8, ini bisa menjadi seperti ini:
Mockito.when(reader.document(anyInt())).thenAnswer( (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
Saya berasumsi bahwa itu
document
adalah peta.sumber