Saya memiliki metode yang dipanggil dua kali, dan saya ingin menangkap argumen panggilan metode kedua.
Inilah yang saya coba:
ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class);
ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class);
verify(mockBar).doSomething(firstFooCaptor.capture());
verify(mockBar).doSomething(secondFooCaptor.capture());
// then do some assertions on secondFooCaptor.getValue()
Tapi saya mendapatkan TooManyActualInvocations
pengecualian, karena Mockito berpikir itu doSomething
hanya boleh disebut sekali.
Bagaimana saya bisa memverifikasi argumen panggilan kedua doSomething
?
java
unit-testing
mocking
mockito
Eric Wilson
sumber
sumber
doSomething()
dalam setiap doa terpisah dengan ini?Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);
argumen yang ditangkap akan sama dua kali (karena sebenarnya itu adalah objek orang yang sama), jadicapturedPeople.get(0).getName() == capturedPeople.get(1).getName() == "Jane"
, lihat juga groups.google.com/forum/#!msg/mockito/ KBRocVedYT0 / 5HtARMl9r2wJ .Runnable
) dan, jika perlu, lakukan pemeriksaan jenis yang lebih spesifik pada argumen yang ditangkap.Sejak Mockito 2.0 ada juga kemungkinan menggunakan metode statis Matchers.argThat (ArgumentMatcher) . Dengan bantuan Java 8 sekarang jauh lebih bersih dan lebih mudah dibaca untuk ditulis:
Jika Anda terikat ke versi Java yang lebih rendah, ada juga yang tidak terlalu buruk:
Tentu saja tidak satu pun dari mereka yang dapat memverifikasi urutan panggilan - yang harus Anda gunakan InOrder :
Silakan lihat proyek mockito-java8 yang memungkinkan untuk melakukan panggilan seperti:
sumber
CharSequence
. Apakah Anda tahu cara untuk mendapatkan laporan untuk mencetak argumen "yang diinginkan" dengan benar?Jika Anda tidak ingin memvalidasi semua panggilan
doSomething()
, hanya yang terakhir, Anda bisa menggunakannyaArgumentCaptor.getValue()
. Menurut javadoc Mockito :Jika metode ini dipanggil beberapa kali maka itu mengembalikan nilai yang diambil terbaru
Jadi ini akan berhasil (anggap
Foo
memiliki metodegetName()
):sumber
Anda juga dapat menggunakan @Captor ArgumentCaptor beranotasi. Sebagai contoh:
sumber
Dengan lambdas Java 8, cara yang mudah adalah menggunakan
sumber
Pertama-tama: Anda harus selalu mengimpor mockito statis, dengan cara ini kode akan jauh lebih mudah dibaca (dan intuitif) - contoh kode di bawah ini mengharuskannya berfungsi:
Dalam metode verifikasi () Anda bisa melewati ArgumentCaptor untuk memastikan eksekusi dalam tes dan ArgumentCaptor untuk mengevaluasi argumen:
Daftar semua argumen yang diteruskan selama pengujian Anda dapat diakses melalui metode argument.getAllValues ().
Nilai argumen tunggal (terakhir disebut) dapat diakses melalui argument.getValue () untuk manipulasi / pemeriksaan lebih lanjut atau apa pun yang ingin Anda lakukan.
sumber