Saya menggunakan JUnit-dep 4.10 dan Hamcrest 1.3.RC2.
Saya telah membuat pencocokan khusus yang terlihat seperti berikut:
public static class MyMatcher extends TypeSafeMatcher<String> {
@Override
protected boolean matchesSafely(String s) {
/* implementation */
}
@Override
public void describeTo(Description description) {
/* implementation */
}
@Override
protected void describeMismatchSafely(String item, Description mismatchDescription) {
/* implementation */
}
}
Ini berfungsi dengan baik ketika dijalankan dari baris perintah menggunakan Ant. Tetapi ketika dijalankan dari IntelliJ, gagal dengan:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)
Dugaan saya adalah bahwa ia menggunakan hamcrest.MatcherAssert yang salah. Bagaimana cara menemukan mana yang menggunakan hamcrest.MatcherAssert (yaitu file jar mana yang digunakan untuk hamcrest.MatcherAssert)? AFAICT, satu-satunya guci hamcrest di classpath saya adalah 1.3.RC2.
Apakah IntelliJ IDEA menggunakan salinan JUnit atau Hamcrest sendiri?
Bagaimana saya menampilkan runtime CLASSPATH yang digunakan IntelliJ?
Masalah ini juga muncul ketika Anda memiliki mockito-semua di jalur kelas Anda, yang sudah usang.
Jika mungkin sertakan saja mockito-core .
Konfigurasi Maven untuk mencampur junit, mockito dan hamcrest:
sumber
Masalahnya adalah yang salah
hamcrest.Matcher
, bukanhamcrest.MatcherAssert
, sedang digunakan. Itu ditarik dari dependensi Junit-4.8 yang ditentukan salah satu dependensi saya.Untuk melihat dependensi apa (dan versi) yang disertakan dari sumber apa saat pengujian, jalankan:
sumber
-all
dengan-core
, dll ...): Saya harus mengubah hamcrest kembali ke versi 1.1 dan sekarang semuanya berfungsi lagi.import static org.mockito.Matchers.anyString;
dariimport static org.mockito.ArgumentMatchers.anyString;
Berikut ini adalah yang paling benar hari ini. Catatan, junit 4.11 tergantung pada hamcrest-core, jadi Anda tidak perlu menentukan bahwa sama sekali, mockito-semua tidak dapat digunakan karena itu termasuk (tidak tergantung pada) hamcrest 1.1
sumber
mockito-all
membantu saya, bukanmockito-core
. Juga mendeklarasikan Hamcrest sebelum Mockito dalampom.xml
karya.Ini bekerja untuk saya setelah berjuang sedikit
sumber
Mencoba
expect(new ThrowableMessageMatcher(new StringContains(message)))
dari pada
expectMessage(message)
Anda dapat menulis metode kustom
ExpectedException
atau utilitas untuk membungkus kode.sumber
Saya tahu ini adalah utas lama tetapi yang memecahkan masalah bagi saya adalah menambahkan yang berikut ini ke file build.gradle saya. Seperti yang sudah dinyatakan di atas ada masalah kompatibilitas dengan
mockito-all
Pos yang mungkin bermanfaat :
sumber
Terlepas dari kenyataan bahwa ini adalah pertanyaan yang sangat lama dan mungkin banyak dari ide-ide tersebut menyelesaikan banyak masalah, saya masih ingin berbagi solusi dengan komunitas yang memperbaiki masalah saya.
Saya menemukan bahwa masalahnya adalah fungsi yang disebut "hasItem" yang saya gunakan untuk memeriksa apakah JSON-Array berisi item tertentu. Dalam kasus saya, saya memeriksa nilai tipe Long.
Dan ini menyebabkan masalah.
Entah bagaimana, Pencocokan memiliki masalah dengan nilai tipe Long. (Saya tidak menggunakan JUnit atau Rest-Assured begitu banyak idk. Persis mengapa, tapi saya rasa JSON-data yang dikembalikan hanya berisi Integer.)
Jadi yang saya lakukan untuk memperbaiki masalah adalah sebagai berikut. Alih-alih menggunakan:
Anda hanya perlu melakukan cast ke Integer. Jadi kode kerjanya terlihat seperti ini:
Itu mungkin bukan solusi terbaik, tapi saya hanya ingin menyebutkan bahwa pengecualian juga dapat dilempar karena tipe data yang salah / tidak dikenal.
sumber
Apa yang berhasil bagi saya adalah mengecualikan kelompok hamcrest dari kompilasi tes junit.
Berikut adalah kode dari build.gradle saya:
Jika Anda menjalankan IntelliJ, Anda mungkin perlu menjalankan
gradle cleanIdea idea clean build
untuk mendeteksi dependensi lagi.sumber
Saya tahu itu bukan jawaban terbaik, tetapi jika Anda tidak dapat membuat classpath bekerja, ini adalah solusi rencana B.
Dalam classpath pengujian saya, saya menambahkan antarmuka berikut dengan implementasi default untuk metode descriptionMismatch.
sumber
Saya memiliki proyek gradle dan ketika bagian dependensi build.gradle saya terlihat seperti ini:
itu mengarah ke pengecualian ini:
untuk memperbaiki masalah ini, saya telah mengganti "mockito-all" dengan "mockito-core".
Penjelasan antara mockito-all dan mockito-core dapat ditemukan di sini: https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -semua-dalam-proyek berbasis-mavengradle /
sumber
Dalam kasus saya, saya harus mengecualikan hamcrest yang lebih tua dari junit-vintage:
sumber
Ini berhasil untuk saya. Tidak perlu mengecualikan apa pun. Saya hanya menggunakan
mockito-core
sajamockito-all
sumber