Saya tidak mengerti bagaimana JUnit 4.8 harus bekerja dengan pencocok Hamcrest. Ada beberapa pencocokan yang ditentukan di junit-4.8.jar
dalam org.hamcrest.CoreMatchers
. Pada saat yang sama ada beberapa matcher lain di hamcrest-all-1.1.jar
dalam org.hamcrest.Matchers
. Jadi, mau kemana? Haruskah saya secara eksplisit memasukkan hamcrest JAR ke dalam proyek dan mengabaikan pencocokan yang disediakan oleh JUnit?
Secara khusus, saya tertarik dengan empty()
matcher dan tidak dapat menemukannya di salah satu toples ini. Saya butuh yang lain? :)
Dan pertanyaan filosofis: mengapa JUnit menyertakan org.hamcrest
paket ke distribusinya sendiri alih-alih mendorong kami untuk menggunakan pustaka hamcrest asli?
org.hamcrest.Matchers.empty()
berada? Bisakah Anda memberi tautan ke file JAR?Jika Anda menggunakan Hamcrest dengan versi yang lebih besar atau sama dari 1.2, maka Anda harus menggunakan
junit-dep.jar
. Jar ini tidak memiliki kelas Hamcrest dan oleh karena itu Anda menghindari masalah pemuatan kelas.Sejak JUnit 4.11,
junit.jar
dirinya sendiri tidak memiliki kelas Hamcrest. Tidak perlujunit-dep.jar
lagi.sumber
Tidak benar-benar menjawab pertanyaan Anda, tetapi Anda harus mencoba FEST-Assert fluent assertions API. Ini bersaing dengan Hamcrest, tetapi memiliki API yang jauh lebih mudah dengan hanya satu impor statis yang diperlukan. Berikut adalah kode yang diberikan oleh cpater menggunakan FEST:
package com.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import static org.fest.assertions.Assertions.assertThat; public class EmptyTest { @Test public void testIsEmpty() { List myList = new ArrayList(); assertThat(myList).isEmpty(); } }
EDIT: Koordinat Maven:
<dependency> <groupId>org.easytesting</groupId> <artifactId>fest-assert</artifactId> <version>1.4</version> <scope>test</scope> </dependency>
sumber
Juga, jika JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 digunakan, pastikan mockito-all tidak digunakan. Ini berisi kelas inti Hamcrest. Gunakan mockito-core sebagai gantinya. Konfigurasi di bawah berfungsi:
<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1.1</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency>
sumber
Karena versi berubah sepanjang waktu, saya mengeposkan untuk memberi tahu orang-orang bahwa mulai 2 Desember 2014, petunjuknya ada di http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in -a-maven-project-junit-mockito-hamcrest-assertj.html berhasil untuk saya. Saya tidak menggunakan AssertJ, hanya ini:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.objenesis</groupId> <artifactId>objenesis</artifactId> <version>1.3</version> <scope>test</scope> </dependency>
sumber
Saya rasa itu karena mereka ingin
assertThat
menjadi bagian dari JUnit. Jadi itu berartiAssert
kelas harus mengimpororg.hamcrest.Matcher
antarmuka dan tidak dapat melakukannya kecuali JUnit bergantung pada Hamcrest, atau menyertakan (setidaknya sebagian) Hamcrest. Dan saya rasa memasukkan sebagian darinya lebih mudah, sehingga JUnit akan dapat digunakan tanpa ketergantungan apa pun.sumber
Di 2018 menggunakan sebagian besar perpustakaan modern:
configurations { all { testCompile.exclude group: "org.hamcrest", module: "hamcrest-core" testCompile.exclude group: "org.hamcrest", module: "hamcrest-library" } } dependencies { testCompile("junit:junit:4.12") // testCompile("org.hamcrest:hamcrest-library:1.3") // testCompile("org.hamcrest:java-hamcrest:2.0.0.0") testCompile("org.hamcrest:hamcrest-junit:2.0.0.0") }
sumber
Baik JUnit-4.12 dan JUnit-Dep-4.10 memiliki dependensi Hamcrest sesuai dengan file .xml masing-masing.
Penyelidikan lebih lanjut menunjukkan bahwa meskipun ketergantungan dibuat dalam file .xml, sumber dan kelas dalam jars. Tampaknya ini adalah cara untuk mengecualikan dependensi di build.gradle ... mengujinya untuk menjaga semuanya tetap bersih.
Hanya fyi
sumber