Karena Java 8 Anda dapat menggunakan metode argumen-kurang any
dan argumen tipe akan disimpulkan oleh kompiler:
verify(bar).doStuff(any());
Penjelasan
Hal baru di Java 8 adalah bahwa tipe target ekspresi akan digunakan untuk menyimpulkan parameter tipe sub-ekspresi. Sebelum Java 8 hanya argumen untuk metode yang digunakan untuk tipe inferensi parameter (sebagian besar waktu).
Dalam hal ini tipe parameter doStuff
akan menjadi tipe target untuk any()
, dan tipe nilai pengembalian any()
akan dipilih untuk mencocokkan tipe argumen itu.
Mekanisme ini ditambahkan di Java 8 terutama untuk dapat mengkompilasi ekspresi lambda, tetapi umumnya meningkatkan inferensi tipe.
Tipe primitif
Sayangnya, ini tidak berfungsi dengan tipe primitif:
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
Masalahnya adalah bahwa kompiler akan menyimpulkan Integer
sebagai nilai balik dari any()
. Mockito tidak akan mengetahui hal ini (karena tipe penghapusan) dan mengembalikan nilai default untuk tipe referensi, yaitu null
. Runtime akan mencoba untuk membuka kotak nilai kembali dengan memanggil intValue
metode di atasnya sebelum meneruskannya doStuff
, dan pengecualian dilemparkan.
any
metode ini seharusnya hanya bekerja. Anda tidak mencari jawaban untuk hal-hal yang hanya berfungsi!