Saya sudah mencari di Google tentang hal ini, tetapi tidak menemukan yang relevan. Saya punya sesuatu seperti ini:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);
Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();
Sekarang, saya ingin memverifikasi itu mymethod(Object o)
, yang disebut di dalam runtestmethod()
, dipanggil dengan Object o
, bukan yang lain. Tapi saya selalu lulus tes, apa pun yang saya masukkan verifikasi, misalnya, dengan:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
atau
Mockito.verify(mock.mymethod(Mockito.eq(null)));
atau
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
Saya selalu lulus ujian. Bagaimana saya bisa menyelesaikan verifikasi itu (jika mungkin)?
Terima kasih.
java
unit-testing
junit
mockito
manolowar
sumber
sumber
Apakah Anda mencoba melakukan kesetaraan logis menggunakan metode .equals objek? Anda dapat melakukan ini dengan menggunakan pencocokan argThat yang termasuk dalam Mockito
Selanjutnya Anda dapat mengimplementasikan pencocokan argumen Anda sendiri yang akan tunduk pada setiap metode .equals objek
Sekarang menggunakan kode Anda, Anda dapat memperbaruinya untuk membaca ...
Jika Anda hanya akan untuk kesetaraan EXACT (objek yang sama dalam memori), lakukan saja
Ini akan memverifikasi itu dipanggil sekali.
sumber
ReflectionEquals
kelas untuk keperluan itu.verify(mock).mymethod(obj);
tidak memeriksa kesetaraan EXACT (objek yang sama dalam memori). Sebaliknya ia menggunakan objek sama dengan-metode yang bisa ditimpa.ArgumentMatcher
agar tidak terlalu bertele-tele.verify()
memanggil metode / inbound argumen /equals()
, daripada / obyek /equals()
metode yang direkam . ini tidak relevan kecuali Anda mencoba untuk mengkonfirmasi bahwa subjek pengujian Anda mengembalikan instance objek tertentu, dan subjek mengembalikan apa yang seharusnya menjadi dekorator transparan dari instance itu. Theverify
argumenequals()
tidak akan tahu dari dekorator; sedangkan dekoratorequals()
akan ditulis ulang untuk mentolerir aslinya. Dalam hal ini pengujian Anda akan gagal.eq
korek api jika Anda tidak menggunakan korek api lainnya..verify(mock)
. Anda sekarang melakukan verifikasi pada hasil pemanggilan metode, tanpa memverifikasi apa pun (tidak melakukan pemanggilan metode). Karenanya semua tes lulus.Kode Anda harus seperti:
sumber
argThat
plus lambdaitulah cara Anda dapat gagal verifikasi argumen Anda:
dimana
argThat
plus menegaskantes di atas akan "mengatakan"
Expected: lambda$... Was: YourClass.toSting...
. Anda bisa mendapatkan penyebab kegagalan yang lebih spesifik jika menggunakan penegasan dalam lambda:TAPI: HANYA INI BEKERJA DENGAN 1 METODE PANGGILAN. Jika metode terverifikasi disebut 2+ kali, mockito meneruskan semua kombinasi yang dipanggil ke setiap verifier. Jadi mockito mengharapkan verifikasi Anda secara diam-diam kembali
true
untuk salah satu set argumen, danfalse
(tanpa pengecualian) untuk panggilan yang valid lainnya. Harapan itu bukan masalah untuk 1 panggilan metode - itu hanya harus mengembalikan true 1 kali.Sekarang tes mengatakan:
Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. CATATAN: Saya menggunakanassertJ
penegasan, tetapi terserah Anda kerangka pernyataan mana yang harus digunakan.argThat
dengan banyak argumen.Jika Anda menggunakan
argThat
, semua argumen harus dilengkapi dengan kecocokan. Misalnya:dimana:
eq
korek apicara termudah untuk memeriksa apakah argumennya sama:
argumen langsung
jika perbandingan dengan ref dapat diterima, maka lanjutkan dengan:
AKAR PENYEBAB kegagalan pertanyaan awal adalah tempat yang salah dari paranthes:
verify(mock.mymethod...
. Itu salah. Yang benar adalah:verify(mock).*
sumber
Saya telah menggunakan Mockito.verifikasikan dengan cara ini
sumber
Sudahkah Anda memeriksa metode yang sama dengan kelas mockable? Jika yang ini mengembalikan selalu benar atau Anda menguji contoh yang sama terhadap contoh yang sama dan metode yang sama tidak ditimpa (dan karenanya hanya memeriksa terhadap referensi), maka itu mengembalikan benar.
sumber
Metode lainnya adalah dengan menggunakan metode org.mockito.internal.matchers.Equals.Equals alih-alih mendefinisikan ulang satu:
sumber
Sudahkah Anda mencobanya dengan pencocokan () yang sama? Seperti dalam:
Saya memiliki masalah yang sama. Saya mencobanya dengan matcher eq () serta matcher refEq () tapi saya selalu memiliki false positive. Ketika saya menggunakan pencocokan yang sama (), tes gagal ketika argumen adalah contoh yang berbeda dan lulus begitu argumen adalah contoh yang sama.
sumber
Anda juga dapat menggunakan TypeSafeDiagnosingMatcher
Kemudian verifikasi permohonan itu:
sumber