Apakah ada cara untuk menangkap daftar tipe tertentu menggunakan mockitos ArgumentCaptore. Ini tidak berfungsi:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
java
unit-testing
junit
mockito
Andreas Köberle
sumber
sumber
ArrayList
). Anda selalu dapat menggunakanList
antarmuka, dan jika Anda ingin merepresentasikan fakta, bahwa itu kovarian, maka Anda dapat menggunakanextends
:ArgumentCaptor<? extends List<SomeType>>
Jawaban:
Masalah generik bersarang dapat dihindari dengan penjelasan @Captor :
sumber
MockitoAnnotations.initMocks(this)
dalam@Before
metode daripada menggunakan pelari yang tidak termasuk kemampuan untuk menggunakan pelari lain. Namun, +1, terima kasih telah menunjukkan anotasi.Ya, ini masalah umum generik, bukan mockito-spesifik.
Tidak ada objek kelas untuk
ArrayList<SomeType>
, dan karenanya Anda tidak bisa mengetik-aman meneruskan objek seperti itu ke metode yang membutuhkan aClass<ArrayList<SomeType>>
.Anda bisa melemparkan objek ke tipe yang tepat:
Ini akan memberikan beberapa peringatan tentang gips yang tidak aman, dan tentu saja ArgumentCaptor Anda tidak dapat benar-benar membedakan antara
ArrayList<SomeType>
danArrayList<AnotherType>
tanpa mungkin memeriksa elemen.(Seperti yang disebutkan dalam jawaban lain, sementara ini adalah masalah umum umum, ada solusi spesifik Mockito untuk masalah keamanan jenis dengan
@Captor
anotasi. Itu masih tidak dapat membedakan antaraArrayList<SomeType>
danArrayList<OtherType>
.)Edit:
Lihatlah juga komentar tenshi . Anda dapat mengubah kode asli dari Paŭlo Ebermann ke ini (lebih sederhana)
sumber
ArgumentCaptor<List<SimeType>> argument = ArgumentCaptor.forClass((Class) List.class);
@SuppressWarnings("unchecked")
anotasi di atas garis definisi penculik argumen. Juga, casting toClass
redundant.Class
tidak berlebihan dalam pengujian saya.Jika Anda tidak takut dengan semantik gaya java lama (non type safe generic), ini juga berfungsi dan cukup sederhana:
sumber
sumber
Berdasarkan komentar @ tenshi dan @ pkalinow (juga pujian untuk @rogerdpack), berikut ini adalah solusi sederhana untuk membuat daftar argumen penculiknya yang juga menonaktifkan peringatan "penggunaan operasi yang tidak dicentang atau tidak aman" :
Contoh lengkap di sini dan pembangunan CI lulus yang sesuai dan uji coba di sini .
Tim kami telah menggunakan ini selama beberapa waktu dalam unit test kami dan ini sepertinya solusi paling mudah bagi kami.
sumber
Untuk versi junit sebelumnya, Anda bisa melakukannya
sumber
Saya memiliki masalah yang sama dengan aktivitas pengujian di aplikasi Android saya. Saya menggunakan
ActivityInstrumentationTestCase2
danMockitoAnnotations.initMocks(this);
tidak bekerja. Saya memecahkan masalah ini dengan kelas lain dengan bidang masing-masing. Sebagai contoh:Kemudian, dalam metode uji aktivitas:
sumber
Ada masalah terbuka di GitHub Mockito tentang masalah ini.
Saya telah menemukan solusi sederhana yang tidak memaksa Anda untuk menggunakan anotasi dalam tes Anda:
Apa yang terjadi di sini adalah bahwa kita membuat kelas baru dengan para
@Captor
penjelasan dan menyuntikkan penculiknya ke dalamnya. Kemudian kita cukup mengekstrak penculiknya dan mengembalikannya dari metode statis kami.Dalam tes Anda, Anda dapat menggunakannya seperti ini:
Atau dengan sintaks yang menyerupai Jackson
TypeReference
:Ini berfungsi, karena Mockito sebenarnya tidak memerlukan informasi jenis apa pun (tidak seperti serializers, misalnya).
sumber