1. Pengenalan
Selain pencocokan bawaan, Hamcrest juga memberikan sokongan untuk membuat pemadan khusus.
Dalam tutorial ini, kami akan melihat dengan lebih dekat cara membuat dan menggunakannya. Untuk mendapatkan penjelasan mengenai pencocok yang ada, rujuk artikel ini.
2. Persediaan Pemadan Khusus
Untuk mendapatkan Hamcrest, kita perlu menambahkan kebergantungan Maven berikut ke pom.xml kami :
org.hamcrest java-hamcrest 2.0.0.0 test
Versi Hamcrest terbaru boleh didapati di Maven Central.
3. Memperkenalkan TypeSafeMatcher
Sebelum memulakan dengan contoh kami, penting untuk memahami kelas TypeSafeMatcher . Kita mesti memperluaskan kelas ini untuk membuat pencocokan kita sendiri.
TypeSafeMatcher adalah kelas abstrak, jadi semua subkelas harus menerapkan kaedah berikut:
- matchSafely (T t) : mengandungi logik pemadanan kami
- descriptionTo (Penerangan keterangan) : menyesuaikan mesej yang akan diterima oleh pelanggan apabila logik pemadanan kami tidak dipenuhi
Seperti yang dapat kita lihat pada kaedah pertama, TypeSafeMatcher adalah parametrized, jadi kita harus menyatakan jenis ketika kita menggunakannya. Itu akan menjadi jenis objek yang sedang kita uji.
Mari jelaskan ini dengan melihat contoh pertama kami di bahagian seterusnya.
4. Mewujudkan onlyDigits Matcher
Untuk kes penggunaan pertama kami, kami akan membuat pemadan yang kembali benar jika String tertentu hanya mengandungi digit.
Jadi, hanya Digit yang diterapkan pada "123" harus kembali benar sementara " hello1 " dan " bye " harus kembali palsu.
Mari kita mulakan!
4.1. Penciptaan Pencocokan
Untuk memulakan dengan pemadan kami, kami akan membuat kelas yang memperluas TypeSafeMatcher :
public class IsOnlyDigits extends TypeSafeMatcher { @Override protected boolean matchesSafely(String s) { // ... } @Override public void describeTo(Description description) { // ... } }
Harap maklum bahawa kerana objek yang akan kami uji adalah teks, kami membuat parametrikan subkelas TypeSafeMatcher kami dengan kelas String.
Sekarang kami bersedia untuk menambahkan pelaksanaan kami:
public class IsOnlyDigits extends TypeSafeMatcher { @Override protected boolean matchesSafely(String s) { try { Integer.parseInt(s); return true; } catch (NumberFormatException nfe){ return false; } } @Override public void describeTo(Description description) { description.appendText("only digits"); } }
Seperti yang kita lihat, matchSafey cuba menguraikan input kita String menjadi Integer . Sekiranya berjaya, ia akan kembali benar . Sekiranya gagal, ia akan kembali palsu . Ia berjaya membalas kes penggunaan kami.
Di sisi lain, describeTo adalah melampirkan teks yang mewakili jangkaan kami. Kami akan melihat bagaimana ini ditunjukkan seterusnya apabila kami menggunakan matcher kami.
Kami hanya memerlukan satu perkara lagi untuk melengkapkan matcher kami: kaedah statik untuk mengaksesnya , jadi ia berperanan sebagai matcher bawaan yang lain.
Oleh itu, kami akan menambahkan sesuatu seperti ini:
public static Matcher onlyDigits() { return new IsOnlyDigits(); }
Dan kita sudah selesai! Mari lihat bagaimana menggunakan matcher ini di bahagian seterusnya.
4.2. Penggunaan Pencocokan
Untuk menggunakan pemadan baru kami, kami akan membuat ujian :
@Test public void givenAString_whenIsOnlyDigits_thenCorrect() { String digits = "1234"; assertThat(digits, onlyDigits()); }
Dan itu sahaja. Ujian ini akan lulus kerana String input hanya mengandungi digit. Ingat bahawa, untuk membuat ia sedikit lebih mudah dibaca, kita boleh menggunakan matcher yang adalah yang bertindak sebagai pembungkus atas mana-mana matcher lain :
assertThat(digits, is(onlyDigits()));
Akhirnya, jika kita menjalankan ujian yang sama tetapi dengan input "123ABC", mesej output adalah:
java.lang.AssertionError: Expected: only digits but: was "123ABC"
Ini adalah di mana kita lihat teks yang kita dilampirkan bersama describeTo kaedah. Seperti yang kita perhatikan, penting untuk membuat penerangan yang tepat mengenai apa yang diharapkan dalam ujian.
5. boleh dibahagi dengan
Jadi, bagaimana jika kita mahu membuat pemadan yang menentukan jika nombor dibahagi dengan nombor lain? Untuk senario itu, kita harus menyimpan salah satu parameter di suatu tempat.
Mari lihat bagaimana kita dapat melakukannya:
public class IsDivisibleBy extends TypeSafeMatcher { private Integer divider; // constructors @Override protected boolean matchesSafely(Integer dividend) { if (divider == 0) { return false; } return ((dividend % divider) == 0); } @Override public void describeTo(Description description) { description.appendText("divisible by " + divider); } public static Matcher divisibleBy(Integer divider) { return new IsDivisibleBy(divider); } }
Cukup sederhana, kami hanya menambahkan atribut baru ke kelas kami dan memberikannya semasa pembinaan . Kemudian, kami memberikannya sebagai parameter kepada kaedah statik kami:
@Test public void givenAnEvenInteger_whenDivisibleByTwo_thenCorrect() { Integer ten = 10; Integer two = 2; assertThat(ten,is(divisibleBy(two))); } @Test public void givenAnOddInteger_whenNotDivisibleByTwo_thenCorrect() { Integer eleven = 11; Integer two = 2; assertThat(eleven,is(not(divisibleBy(two)))); }
Dan itu sahaja! Kami sudah mempunyai jodoh kami menggunakan lebih dari satu input!
6. Kesimpulannya
Hamcrest menyediakan pemadan yang merangkumi kebanyakan kes penggunaan yang biasanya dihadapi oleh pembangun ketika membuat penegasan.
Lebih-lebih lagi, jika ada kes tertentu yang tidak dilindungi, Hamcrest juga memberikan sokongan untuk membuat pemadan khusus untuk digunakan dalam senario tertentu - seperti yang telah kami terokai di sini . Mereka mudah dibuat, dan digunakan sama seperti yang terdapat di perpustakaan.
Untuk mendapatkan pelaksanaan lengkap contoh ini, sila rujuk Projek GitHub.