Adakah yang tahu mengapa JUnit 4 menyediakan assertEquals(foo,bar)
tetapi tidak menggunakan assertNotEqual(foo,bar)
metode?
Ini menyediakan assertNotSame
(sesuai dengan assertSame
) dan assertFalse
(sesuai dengan assertTrue
), sehingga tampak aneh bahwa mereka tidak repot termasuk assertNotEqual
.
Omong-omong, saya tahu bahwa JUnit-addons menyediakan metode yang saya cari. Aku hanya bertanya karena penasaran.
Jawaban:
Saya sarankan Anda menggunakan pernyataan
assertThat()
gaya yang lebih baru , yang dapat dengan mudah menggambarkan semua jenis negasi dan secara otomatis membangun deskripsi tentang apa yang Anda harapkan dan apa yang Anda dapatkan jika pernyataan gagal:Ketiga opsi itu setara, pilih yang menurut Anda paling mudah dibaca.
Untuk menggunakan nama-nama sederhana metode (dan memungkinkan sintaksis tegang ini bekerja), Anda perlu impor ini:
sumber
assertNotEquals()
.assertNotEqual
" saya akan mengatakan itu karena itu adalah pernyataan khusus yang tidak diperlukan seseringassertEquals
dan karena itu akan diekspresikan melalui generikassertFalse
.assertThat
jauh lebih ekspresif daripada set terbatasassert*
metode yang tersedia. Oleh karena itu Anda dapat mengungkapkan kendala yang tepat dalam satu baris, membuatnya (hampir) membaca seperti kalimat bahasa Inggris dan mendapatkan pesan yang bermakna ketika pernyataan gagal. Memang, itu tidak selalu merupakan fitur pembunuh, tetapi ketika Anda telah melihatnya beraksi beberapa kali, Anda akan melihat berapa banyak nilai yang ditambahkan.assertThat
lebih ekspresif daripadaassert*
, tapi saya tidak berpikir itu lebih ekspresif daripada ekspresi java yang dapat Anda masukkan ke dalam dan keluar dariassert*
ekspresi secara umum (setelah semua saya dapat mengekspresikan apa pun dalam kode java). Ini adalah masalah umum yang saya mulai temukan dengan API gaya lancar - setiap orang pada dasarnya adalah DSL baru yang harus Anda pelajari (ketika kita semua sudah tahu yang Jawa!). Saya kira Hamcrest sudah ada di mana-mana sekarang karena masuk akal untuk mengharapkan orang mengetahuinya. Saya akan bermain ...Ada
assertNotEquals
dalam JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assumesumber
Saya juga heran. API Assert tidak terlalu simetris; untuk menguji apakah objek sama, ia menyediakan
assertSame
danassertNotSame
.Tentu saja, tidak terlalu lama untuk menulis:
Dengan pernyataan seperti itu, satu-satunya bagian informatif dari output sayangnya adalah nama metode pengujian, sehingga pesan deskriptif harus dibentuk secara terpisah:
Tentu saja itu sangat membosankan, lebih baik Anda menggulungnya sendiri
assertNotEqual
. Untungnya di masa depan mungkin akan menjadi bagian dari JUnit: JUnit edisi 22sumber
Saya berpendapat bahwa tidak adanya assertNotEqual memang asimetri dan membuat JUnit sedikit kurang bisa dipelajari. Pikiran bahwa ini adalah kasus yang rapi ketika menambahkan metode akan mengurangi kompleksitas API, setidaknya bagi saya: Simetri membantu mengatur ruang yang lebih besar. Dugaan saya adalah bahwa alasan penghilangan tersebut mungkin karena terlalu sedikit orang yang memanggil metode ini. Namun, saya ingat saat ketika bahkan menyatakan Salah tidak ada; karenanya, saya memiliki harapan positif bahwa metode ini pada akhirnya mungkin ditambahkan, mengingat bahwa itu bukan metode yang sulit; meskipun saya mengakui bahwa ada banyak solusi, bahkan yang elegan.
sumber
Saya datang ke pesta ini agak terlambat tetapi saya menemukan bahwa formulir:
dapat dibuat berfungsi untuk sebagian besar kasus 'tidak sama'.
sumber
Saya sedang mengerjakan JUnit di lingkungan java 8, menggunakan jUnit4.12
bagi saya: kompiler tidak dapat menemukan metode assertNotEquals, bahkan ketika saya menggunakannya
import org.junit.Assert;
Jadi saya berubah
assertNotEquals("addb", string);
menjadi
Assert.assertNotEquals("addb", string);
Jadi, jika Anda menghadapi masalah tentang
assertNotEqual
tidak dikenal, maka ubahlah untukAssert.assertNotEquals(,);
itu harus menyelesaikan masalah Andasumber
import static org.junit.Assert.*;
dan Anda akan dapat menggunakan semua pernyataan tanpa nama kelas.Alasan yang jelas bahwa orang menginginkan assertNotEquals () adalah untuk membandingkan builtin tanpa harus mengonversinya menjadi objek yang penuh sesak nafas terlebih dahulu:
Contoh lisan:
vs.
Sayangnya sejak Eclipse tidak memasukkan JUnit 4.11 secara default, Anda harus verbose.
Peringatan Saya tidak berpikir '1' perlu dibungkus dengan Integer.valueOf () tapi karena saya baru kembali dari .NET tidak mengandalkan kebenaran saya.
sumber
Lebih baik menggunakan Hamcrest untuk pernyataan negatif daripada pernyataan palsu. Seperti pada laporan tes sebelumnya akan menunjukkan perbedaan untuk kegagalan pernyataan.
Jika Anda menggunakan assertFalse, Anda hanya mendapatkan kegagalan pernyataan dalam laporan. yaitu kehilangan informasi tentang penyebab kegagalan.
sumber
Biasanya saya melakukan ini ketika saya berharap dua objek sama:
dan:
ketika mereka diharapkan tidak setara. Saya sadar bahwa ini bukan jawaban untuk pertanyaan Anda tetapi ini adalah yang terdekat yang bisa saya dapatkan. Ini dapat membantu orang lain mencari apa yang dapat mereka lakukan dalam versi JUnit sebelum JUnit 4.11.
sumber
Saya setuju sepenuhnya dengan sudut pandang OP.
Assert.assertFalse(expected.equals(actual))
bukanlah cara alami untuk mengekspresikan ketidaksetaraan.Tapi saya berpendapat bahwa lebih jauh dari itu
Assert.assertEquals()
,Assert.assertNotEquals()
bekerja tetapi tidak ramah pengguna untuk mendokumentasikan apa yang sebenarnya ditegaskan oleh tes dan untuk memahami / debug ketika pernyataan gagal.Jadi ya JUnit 4.11 dan JUnit 5 menyediakan
Assert.assertNotEquals()
(Assertions.assertNotEquals()
dalam JUnit 5) tapi saya benar-benar menghindari menggunakannya.Sebagai alternatif, untuk menegaskan keadaan suatu objek, saya umumnya menggunakan pencocokan API yang menggali ke dalam keadaan objek dengan mudah, yang mendokumentasikan dengan jelas maksud pernyataan tersebut dan yang sangat ramah pengguna untuk memahami penyebab kegagalan pernyataan tersebut.
Berikut ini sebuah contoh.
Misalkan saya memiliki kelas Hewan yang ingin saya uji
createWithNewNameAndAge()
metodenya, metode yang menciptakan objek Hewan baru dengan mengubah nama dan usianya tetapi dengan menyimpan makanan favoritnya.Misalkan saya gunakan
Assert.assertNotEquals()
untuk menyatakan bahwa objek asli dan baru berbeda.Berikut adalah kelas Hewan dengan implementasi cacat
createWithNewNameAndAge()
:JUnit 4.11+ (atau JUnit 5) baik sebagai test runner dan alat penegasan
Tes gagal seperti yang diharapkan tetapi penyebab yang diberikan kepada pengembang benar-benar tidak membantu. Ia hanya mengatakan bahwa nilainya harus berbeda dan mengeluarkan
toString()
hasil yang dipanggil padaAnimal
parameter aktual :Ok objek tidak sama. Tapi di mana masalahnya?
Bidang mana yang tidak dinilai dengan benar dalam metode yang diuji? Satu ? Dua? Mereka semua ?
Untuk mengetahuinya, Anda harus menggali dalam
createWithNewNameAndAge()
implementasi / menggunakan debugger sementara pengujian API akan jauh lebih ramah jika itu akan membuat kita perbedaan antara yang diharapkan dan yang didapat.JUnit 4.11 sebagai pelari uji dan API Matcher uji sebagai alat penegasan
Di sini skenario pengujian yang sama tetapi yang menggunakan AssertJ (API pencocokan uji yang sangat baik) untuk membuat pernyataan
Animal
negara::Tentu saja tes masih gagal tetapi kali ini alasannya dinyatakan dengan jelas:
Kita dapat membaca bahwa untuk
Animal::getName, Animal::getAge, Animal::getFavoriteFood
nilai - nilai Hewan yang dikembalikan, kami berharap memiliki nilai ini:tetapi kami telah memiliki nilai-nilai ini:
Jadi kita tahu di mana menginvestigasi:
name
danage
tidak dinilai dengan benar. Selain itu, fakta menentukanhay
nilai dalam pernyataanAnimal::getFavoriteFood()
memungkinkan juga untuk lebih halus menegaskan kembaliAnimal
. Kami ingin agar objek tidak sama untuk beberapa properti tetapi tidak harus untuk setiap properti.Jadi pastinya, menggunakan matcher API jauh lebih jelas dan fleksibel.
sumber
Modulo API konsistensi, mengapa JUnit tidak memberikan
assertNotEquals()
alasan yang sama mengapa JUnit tidak pernah memberikan metode sepertiassertStringMatchesTheRegex(regex, str)
vs.assertStringDoesntMatchTheRegex(regex, str)
assertStringBeginsWith(prefix, str)
vs.assertStringDoesntBeginWith(prefix, str)
yaitu tidak ada akhir untuk memberikan metode pernyataan spesifik untuk hal-hal yang mungkin Anda inginkan dalam logika pernyataan Anda!
Jauh lebih baik untuk memberikan primitif tes composable seperti
equalTo(...)
,is(...)
,not(...)
,regex(...)
dan membiarkan programmer potongan mereka bersama-sama, bukan untuk lebih mudah dibaca dan kewarasan.sumber