Pengantar AssertJ

Artikel ini adalah bagian dari serial: • Pengantar AssertJ (artikel saat ini) • AssertJ untuk Guava

• Fitur Java 8 AssertJ

• Pernyataan Kustom dengan AssertJ

1. Ikhtisar

Dalam artikel ini kita akan menjelajahi AssertJ - perpustakaan berbasis komunitas open source yang digunakan untuk menulis pernyataan yang lancar dan kaya dalam pengujian Java.

Artikel ini berfokus pada alat yang tersedia di modul AssertJ dasar yang disebut AssertJ-core .

2. Ketergantungan Maven

Untuk menggunakan AssertJ, Anda perlu menyertakan bagian berikut di file pom.xml Anda :

 org.assertj assertj-core 3.4.1 test  

Dependensi ini hanya mencakup pernyataan Java dasar. Jika Anda ingin menggunakan pernyataan lanjutan, Anda perlu menambahkan modul tambahan secara terpisah.

Perhatikan bahwa untuk Java 7 dan sebelumnya Anda harus menggunakan AssertJ core versi 2.xx

Versi terbaru dapat ditemukan di sini.

3. Pendahuluan

AssertJ menyediakan sekumpulan kelas dan metode utilitas yang memungkinkan kita menulis pernyataan yang lancar dan indah dengan mudah untuk:

  • Java Standar
  • Jawa 8
  • Jambu biji
  • Waktu Joda
  • Neo4J dan
  • Komponen ayun

Daftar terperinci dari semua modul tersedia di situs web proyek.

Mari kita mulai 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 beri kami ikhtisar tentang bagaimana menulis pernyataan dengan perpustakaan ini mungkin terlihat.

4. AssertJ in Action

Di bagian ini kita akan fokus pada pengaturan AssertJ dan mengeksplorasi kemungkinannya.

4.1. Mulai

Dengan jar library di classpath, mengaktifkan pernyataan semudah menambahkan satu impor statis ke kelas pengujian Anda:

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

4.2. Menulis Pernyataan

Untuk menulis pernyataan, Anda harus selalu memulai dengan meneruskan objek Anda ke metode Assertions.assertThat () lalu Anda mengikuti dengan pernyataan sebenarnya.

Penting untuk diingat bahwa tidak seperti beberapa pustaka lainnya, kode di bawah ini belum benar-benar menegaskan apa pun dan tidak akan pernah gagal dalam pengujian:

assertThat(anyRefenceOrValue);

Jika Anda memanfaatkan fitur penyelesaian kode IDE, menulis pernyataan AssertJ menjadi sangat mudah karena metodenya yang sangat deskriptif. Beginilah tampilannya di IntelliJ IDEA 16:

Fitur penyelesaian kode IDE

Seperti yang Anda lihat, Anda memiliki lusinan metode kontekstual untuk dipilih dan hanya tersedia untuk tipe String . Mari jelajahi secara detail beberapa API ini dan lihat beberapa pernyataan spesifik.

4.3. Pernyataan Objek

Objek dapat dibandingkan dengan berbagai cara baik untuk menentukan persamaan dua objek atau untuk memeriksa bidang suatu objek.

Mari kita lihat dua cara kita dapat membandingkan persamaan dua objek. Diberikan 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 kesetaraan dengan pernyataan berikut:

assertThat(fido).isEqualTo(fidosClone);

Ini akan gagal karena isEqualTo () membandingkan referensi objek. Jika kita ingin membandingkan isinya, kita bisa menggunakan isEqualToComparingFieldByFieldRecursively () seperti:

assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);

Fido dan fidosClone sama ketika melakukan bidang rekursif dengan perbandingan medan karena setiap bidang dari satu objek dibandingkan dengan bidang di objek lainnya.

Ada banyak metode pernyataan lain yang menyediakan cara berbeda untuk membandingkan dan mengontrak objek serta untuk memeriksa dan menegaskan di bidangnya. Untuk menemukan semuanya, lihat dokumentasi resmi AbstractObjectAssert .

4.4. Pernyataan Boolean

Beberapa metode sederhana tersedia untuk pengujian kebenaran:

  • adalah benar()
  • isFalse ()

Mari kita 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 fitur pemrograman fungsional Java 8. Mari selami contoh dan lihat beraksi. Pertama mari kita lihat bagaimana kita melakukannya di Java 7:

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

Di sini kami memfilter koleksi balapan Hobbit dan di Java 8 kami dapat melakukan sesuatu seperti ini:

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

Kami akan mengeksplorasi kemampuan Java8 AssertJ di artikel mendatang dari seri ini. Contoh di atas diambil dari situs AssertJ.

7. Kesimpulan

Dalam artikel ini kami secara singkat mengeksplorasi kemungkinan yang diberikan AssertJ bersama dengan pernyataan paling populer untuk tipe inti Java.

Penerapan semua contoh dan cuplikan kode dapat ditemukan di proyek GitHub.

Berikutnya » AssertJ untuk Guava