Pengenalan kepada AssertJ

Artikel ini adalah sebahagian daripada siri: • Pengenalan kepada AssertJ (artikel semasa) • AssertJ untuk Jambu Batu

• Ciri Java 8 AssertJ

• Tegasan Tersuai dengan AssertJ

1. Gambaran keseluruhan

Dalam artikel ini, kita akan menjelajahi AssertJ - sebuah perpustakaan berasaskan sumber terbuka yang digunakan untuk menulis penegasan yang fasih dan kaya dalam ujian Java.

Artikel ini memberi tumpuan kepada alat yang terdapat dalam modul asas AssertJ yang disebut AssertJ-core .

2. Pergantungan Maven

Untuk menggunakan AssertJ, anda perlu memasukkan bahagian berikut dalam fail pom.xml anda :

 org.assertj assertj-core 3.4.1 test  

Pergantungan ini hanya merangkumi pernyataan asas Java. Sekiranya anda ingin menggunakan penegasan lanjutan, anda perlu menambahkan modul tambahan secara berasingan.

Perhatikan bahawa untuk Java 7 dan lebih awal anda harus menggunakan versi teras AssertJ 2.xx

Versi terkini boleh didapati di sini.

3. Pengenalan

AssertJ menyediakan sekumpulan kelas dan kaedah utiliti yang membolehkan kami menulis penegasan yang lancar dan indah dengan mudah untuk:

  • Java Piawai
  • Jawa 8
  • Jambu batu
  • Masa Joda
  • Neo4J dan
  • Komponen ayunan

Senarai terperinci semua modul boleh didapati di laman web projek.

Mari kita mulakan dengan beberapa contoh, langsung dari dokumentasi AssertJ:

assertThat(frodo) .isNotEqualTo(sauron) .isIn(fellowshipOfTheRing); assertThat(frodo.getName()) .startsWith("Fro") .endsWith("do") .isEqualToIgnoringCase("frodo"); assertThat(fellowshipOfTheRing) .hasSize(9) .contains(frodo, sam) .doesNotContain(sauron);

Contoh di atas hanyalah puncak gunung es, tetapi memberi kita gambaran umum tentang bagaimana penulisan penegasan dengan perpustakaan ini.

4. AssertJ dalam Tindakan

Di bahagian ini, kita akan menumpukan pada penyediaan AssertJ dan meneroka kemungkinannya.

4.1. Bermula

Dengan balang perpustakaan di jalan kelas, membolehkan penegasan semudah menambahkan import statik tunggal ke kelas ujian anda:

import static org.assertj.core.api.Assertions.*;

4.2. Tegasan Menulis

Untuk menulis penegasan, anda selalu perlu memulakan dengan meneruskan objek anda ke kaedah Assertions.assertThat () dan kemudian anda mengikuti dengan penegasan sebenar.

Penting untuk diingat bahawa tidak seperti beberapa perpustakaan lain, kod di bawah sebenarnya tidak menegaskan apa-apa dan tidak akan pernah gagal dalam ujian:

assertThat(anyRefenceOrValue);

Sekiranya anda memanfaatkan ciri penyelesaian kod IDE anda, menulis penegasan AssertJ menjadi sangat mudah kerana kaedahnya yang sangat deskriptif. Beginilah rupa di IntelliJ IDEA 16:

Ciri penyelesaian kod IDE

Seperti yang anda lihat, anda mempunyai puluhan kaedah kontekstual untuk dipilih dan kaedah tersebut hanya tersedia untuk jenis String . Mari kita terokai secara terperinci beberapa API ini dan melihat beberapa penegasan khusus.

4.3. Tegasan Objek

Objek dapat dibandingkan dengan pelbagai cara sama ada untuk menentukan persamaan dua objek atau untuk memeriksa bidang objek.

Mari kita lihat dua cara yang boleh kita bandingkan persamaan dua objek. Memandangkan dua objek Dog berikut fido dan fidosClone :

public class Dog { private String name; private Float weight; // standard getters and setters } Dog fido = new Dog("Fido", 5.25); Dog fidosClone = new Dog("Fido", 5.25);

Kita dapat membandingkan persamaan dengan pernyataan berikut:

assertThat(fido).isEqualTo(fidosClone);

Ini akan gagal kerana isEqualTo () membandingkan rujukan objek. Sekiranya kita mahu membandingkan kandungannya, kita boleh menggunakan isEqualToComparingFieldByFieldRecursively () seperti:

assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);

Fido dan fidosClone sama ketika melakukan medan rekursif dengan perbandingan medan kerana setiap bidang satu objek dibandingkan dengan medan di objek lain.

Terdapat banyak kaedah penegasan lain yang menyediakan cara yang berbeza untuk membandingkan dan mengontrak objek dan untuk memeriksa dan menegaskan bidangnya. Untuk mengetahui semuanya, rujuk dokumentasi AbstractObjectAssert rasmi .

4.4. Tegasan Boolean

Beberapa kaedah mudah ada untuk ujian kebenaran:

  • betul()
  • adalah Salah ()

Mari lihat mereka beraksi:

assertThat("".isEmpty()).isTrue();

4.5. Iterable/Array Assertions

For an Iterable or an Array there are multiple ways of asserting that their content exist. One of the most common assertions would be to check if an Iterable or Array contains a given element:

List list = Arrays.asList("1", "2", "3"); assertThat(list).contains("1");

or if a List is not empty:

assertThat(list).isNotEmpty();

or if a List starts with a given character. For example “1”:

assertThat(list).startsWith("1");

Keep in mind that if you want to create more than one assertion for the same object, you can join them together easily.

Here is an example of an assertion that checks if a provided list is not empty, contains “1” element, does not contains any nulls and contains sequence of elements “2”, “3”:

assertThat(list) .isNotEmpty() .contains("1") .doesNotContainNull() .containsSequence("2", "3");

Of course many more possible assertions exist for those types. In order to discover them all, refer to the official AbstractIterableAssert documentation.

4.6. Character Assertions

Assertions for character types mostly involve comparisons and even checking if a given character is from a Unicode table.

Here is an example of an assertion that checks if a provided character is not ‘a', is in Unicode table, is greater than ‘b' and is lowercase:

assertThat(someCharacter) .isNotEqualTo('a') .inUnicode() .isGreaterThanOrEqualTo('b') .isLowerCase();

For a detailed list of all character types' assertions, see AbstractCharacterAssert documentation.

4.7. Class Assertions

Assertions for Class type are mostly about checking its fields, Class types, presence of annotations and class finality.

If you want to assert that class Runnable is an interface, you need to simply write:

assertThat(Runnable.class).isInterface();

or if you want to check if one class is assignable from the other:

assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);

All possible Class assertions can be viewed in the AbstractClassAssert documentation.

4.8. File Assertions

File assertions are all about checking if a given File instance exists, is a directory or a file, has certain content, is readable, or has given extension.

Here you can see an example of an assertion that checks if a given file exists, is file and not a directory, can be readable and writable:

 assertThat(someFile) .exists() .isFile() .canRead() .canWrite();

All possible Class assertions can be viewed in the AbstractFileAssert documentation.

4.9. Double/Float/Integer Assertions

Double/Float/Integer and Other Number Types

Numeric assertions are all about comparing numeric values within or without a given offset. For example, if you want to check if two values are equal according to a given precision we can do the following:

assertThat(5.1).isEqualTo(5, withPrecision(1d));

Notice that we are using already imported withPrecision(Double offset) helper method for generating Offset objects.

For more assertions, visit AbstractDoubleAssert documentation.

4.10. InputStream Assertions

There is only one InputStream-specific assertion available:

  • hasSameContentAs(InputStream expected)

and in action:

assertThat(given).hasSameContentAs(expected);

4.11. Map Assertions

Map assertions allow you to check if a map contains certain entry, set of entries, or keys/values separately.

And here you can see an example of an assertions that checks if a given map is not empty, contains numeric key “2”, does not contain numeric key “10” and contains entry: key: 2, value: “a”:

assertThat(map) .isNotEmpty() .containsKey(2) .doesNotContainKeys(10) .contains(entry(2, "a"));

For more assertions, see AbstractMapAssert documentation.

4.12. Throwable Assertions

Throwable assertions allow for example: inspecting exception's messages, stacktraces, cause checking or verifying if an exception has been thrown already.

Let's have a look at the example of an assertion that checks if a given exception was thrown and has a message ending with “c”:

assertThat(ex).hasNoCause().hasMessageEndingWith("c");

For more assertions, see AbstractThrowableAssert documentation.

5. Describing Assertions

In order to achieve even higher verbosity level, you can create dynamically generated custom descriptions for your assertions. The key to doing this is the as(String description, Object… args) method.

If you define your assertion like this:

assertThat(person.getAge()) .as("%s's age should be equal to 100", person.getName()) .isEqualTo(100);

this is what you will get when running tests:

[Alex's age should be equal to 100] expected: but was:

6. Java 8

AssertJ memanfaatkan sepenuhnya ciri pengaturcaraan fungsional Java 8. Mari selami contoh dan melihatnya dalam tindakan. Pertama mari kita lihat bagaimana kita melakukannya di Java 7:

assertThat(fellowshipOfTheRing) .filteredOn("race", HOBBIT) .containsOnly(sam, frodo, pippin, merry);

Di sini kita menyaring koleksi pada perlumbaan Hobbit dan di Java 8 kita dapat melakukan sesuatu seperti ini:

assertThat(fellowshipOfTheRing) .filteredOn(character -> character.getRace().equals(HOBBIT)) .containsOnly(sam, frodo, pippin, merry);

Kami akan meneroka keupayaan Java8 AssertJ dalam artikel akan datang dari siri ini. Contoh di atas diambil dari laman web AssertJ.

7. Kesimpulannya

Dalam artikel ini, kami menerangkan secara ringkas kemungkinan yang diberikan oleh AssertJ bersama dengan pernyataan yang paling popular untuk jenis Java teras.

Pelaksanaan semua contoh dan potongan kod boleh didapati dalam projek GitHub.

Seterusnya » AssertJ untuk Jambu Batu