6.1 menegaskan

Penegasan adalah pemeriksaan khusus yang dapat disisipkan di tempat berbeda dalam kode. Tugas mereka adalah menentukan bahwa ada yang tidak beres. Atau lebih tepatnya, untuk memeriksa apakah semuanya berjalan sebagaimana mestinya. Ini "sesuai kebutuhan" dan memungkinkan Anda mengaturnya dengan berbagai cara.

Anda telah menemukan beberapa pernyataan dalam kode di atas. Yang pertama adalah memeriksa objek untuk kesetaraan. Jika objek tidak sama, pengecualian akan dilemparkan dan pengujian akan gagal.

Urutan perbandingan penting di sini , karena JUnit dalam laporan akhir akan menulis sesuatu seperti “nilai 1 diterima, tetapi diharapkan 3”. Format umum untuk cek semacam itu adalah:

assertEquals(standard , meaning)

Contoh:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 Metode assertEquals, assertTrue, assertFalse

Di bawah ini saya akan mencantumkan metode yang paling populer - pernyataan. Dari namanya, sangat mungkin untuk menebak cara kerjanya. Tapi saya tetap akan menulis penjelasan singkat:

menegaskanEquals Memeriksa bahwa dua objek sama
menegaskanArrayEquals Memeriksa apakah dua larik berisi nilai yang sama
menegaskanNotNull Memeriksa apakah argumennya bukan nol
menegaskanNull Memeriksa apakah argumennya nol
menegaskanTidakSama Periksa apakah kedua argumen tersebut bukan objek yang sama
menegaskan Sama Periksa apakah kedua argumen adalah objek yang sama
menegaskanBenar Memeriksa apakah argumen itu benar
assertFalse Memeriksa apakah argumen salah

Beberapa metode ini tampak berlebihan. Mengapa menggunakan assertSame(a, b) saat Anda bisa menulis assertTrue(a == b) ?

Intinya adalah menegaskan adalah metode yang sangat cerdas. Itu melakukan banyak hal berguna, termasuk menulis informasi kesalahan ke log . Dalam kasus pertama, ia akan menulis bahwa objek A diharapkan, tetapi objek B diterima.Dalam kasus kedua, ia hanya akan menulis bahwa true diharapkan .

Saat Anda memiliki ratusan pengujian, terutama yang berjalan di server pengujian khusus, memiliki log terperinci bisa sangat membantu. Saya pikir Anda mengerti apa yang saya maksud.

Contoh perbandingan array:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 metode assertAll

Seperti disebutkan di atas, metode assert tidak hanya melakukan pemeriksaan, tetapi juga menulis banyak informasi tentang objek yang sebanding ke log.

Mari kita buat perbandingan:

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

Tetapi jika salah satu parameter tidak cocok, maka sisanya tidak akan diperiksa. Tapi saya ingin mereka tetap terjadi dan hasilnya dicatat di log. Tetapi pada saat yang sama, jika setidaknya satu pemeriksaan gagal, maka pengujian tersebut tetap gagal.

Ada metode khusus untuk ini - assertAll() . Sebagai argumen pertama, dibutuhkan komentar untuk ditulis ke log, dan kemudian sejumlah fungsi penegasan.

Inilah bagaimana contoh kita akan ditulis ulang dengannya:

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

Kemudian jika alamatnya salah, sesuatu seperti ini akan ditulis ke log:

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 metode assertTimeout

Ingat anotasi @Timeout ? Itu memungkinkan untuk mengontrol waktu eksekusi dari seluruh metode. Namun terkadang berguna untuk menetapkan batasan pada eksekusi beberapa bagian kode di dalam metode. Anda dapat menggunakan assertTimeout() untuk ini .

Waktu dilewatkan sebagai parameter pertama, dan kode (fungsi) yang harus dijalankan dalam waktu yang ditentukan dilewatkan sebagai parameter kedua. Contoh:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

Kelas Assert memiliki 12 varian metode assertTimeout() . Jika Anda ingin mempelajari lebih lanjut tentang mereka, selamat datang di dokumentasi resmi .

6.5 metode assertThrows

Sangat sering ada situasi ketika Anda perlu memastikan bahwa dalam situasi tertentu kode melempar pengecualian yang tepat: mendeteksi kesalahan dan melempar pengecualian yang tepat. Ini adalah situasi yang sangat umum.

Dalam hal ini, ada metode penegasan lain yang berguna - ini adalah assertThrows() . Format umum panggilannya adalah:

assertThrows(exception , code)

Pada dasarnya, ini sangat mirip dengan metode assertTimeout() , hanya saja ia memeriksa apakah kode yang ditentukan melontarkan pengecualian yang benar. Contoh:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}