Bagaimana cara memverifikasi bahwa suatu metode tidak dipanggil pada ketergantungan objek?
Sebagai contoh:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
Dengan tes Foo:
public class FooTest {
@Test
public void dependencyIsNotCalled() {
final Foo foo = new Foo(...);
final Dependency dependency = mock(Dependency.class);
foo.bar(dependency);
**// verify here that someMethod was not called??**
}
}
never
adalah cara terbaik dan paling spesifik, tetapi jika Anda perlu memeriksa seluruh objek tiruan, pertimbangkan jugaverifyZeroInteractions(mockObject)
atauverifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
telah ditinggalkan.verifyNoInteractions
adalah alternatif yang disarankan. Versi Mockito pada saat komentar ini adalah 3.3.3gunakan argumen kedua pada
Mockito.verify
metode, seperti pada:verify(dependency, Mockito.times(0)).someMethod()
sumber
never()
tidak secara signifikan lebih mudah dibaca daripadatimes(0)
. Tetapi keberadaannever
memang meningkatkan beban kognitif dan membuat sistem mockito lebih sulit untuk memahami dan mengingat cara menggunakannya. Jadi mockito benar-benar seharusnya tidak termasuknever
dalam API mereka, itu tidak sebanding dengan biaya mental.someMethod
dipanggil 0 kali, atau apakah hanya memverifikasi yangsomeMethod
tidak pernah dipanggil dengan argumen nol?someMethod
dengan argumen nol disebut nol kali - tidak diverifikasi.Sebagai pola yang lebih umum untuk diikuti, saya cenderung menggunakan
@After
blok dalam tes:Maka tes bebas untuk memverifikasi hanya apa yang harus dipanggil.
Juga, saya menemukan bahwa saya sering lupa untuk memeriksa "tidak ada interaksi", hanya untuk kemudian menemukan bahwa hal-hal sedang dipanggil yang seharusnya.
Jadi saya menemukan pola ini berguna untuk menangkap semua panggilan tak terduga yang belum secara khusus diverifikasi.
sumber
verifyNoMoreInteractions
? Jawaban lain di sini bergantung pada penulis tes yang secara eksplisit mengingat untuk mencantumkan cek ini: terlalu rentan kesalahan dalam buku saya.Pertama-tama: Anda harus selalu mengimpor mockito statis, dengan cara ini kode akan jauh lebih mudah dibaca (dan intuitif):
Sebenarnya ada banyak cara untuk mencapai ini, namun (bisa dibilang) lebih bersih untuk menggunakan
metode di seluruh tes Anda, ketika pada Tes lain Anda menggunakannya untuk menyatakan sejumlah eksekusi seperti ini:
Alternatifnya adalah:
Atau - ketika Anda benar-benar ingin memastikan Objek yang diejek sebenarnya TIDAK disebut sama sekali - Anda dapat menggunakan:
sumber
Baik metode
verifyNoMoreInteractions()
maupun secaraverifyZeroInteractions()
internal memiliki implementasi yang sama seperti:jadi kita bisa menggunakan salah satu dari mereka pada objek tiruan atau array objek tiruan untuk memeriksa bahwa tidak ada metode yang dipanggil menggunakan objek tiruan.
sumber