6.1 menegaskan

Penegasan ialah semakan khas yang boleh dimasukkan di tempat yang berbeza dalam kod. Tugas mereka adalah untuk menentukan ada sesuatu yang tidak kena. Atau sebaliknya, untuk memastikan semuanya berjalan sebagaimana mestinya. Ini "mengikut keperluan" dan mereka membenarkan anda menetapkannya dalam pelbagai cara.

Anda telah pun menemui beberapa penegasan dalam kod di atas. Yang pertama ialah menyemak objek untuk kesamarataan. Jika objek tidak sama, pengecualian akan dilemparkan dan ujian akan gagal.

Urutan perbandingan adalah penting di sini , kerana JUnit dalam laporan akhir akan menulis sesuatu seperti "nilai 1 diterima, tetapi 3 dijangkakan". Format umum untuk semakan sedemikian ialah:

assertEquals(standard , meaning)

Contoh:

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

    assertEquals(expected, actual);
}

6.2 Kaedah assertEquals, assertTrue, assertFalse

Di bawah saya akan menyenaraikan kaedah yang paling popular - dakwaan. Dengan nama mereka adalah agak mungkin untuk meneka bagaimana mereka bekerja. Tetapi saya akan menulis penjelasan ringkas pula:

assertEquals Semak bahawa dua objek adalah sama
assertArrayEquals Semak jika dua tatasusunan mengandungi nilai yang sama
assertNotNull Menyemak sama ada hujah itu tidak batal
assertNull Menyemak sama ada hujah adalah batal
menegaskanTidak Sama Semak bahawa kedua-dua hujah bukan objek yang sama
menegaskanSama Semak bahawa kedua-dua hujah adalah objek yang sama
tegaskanBenar Menyemak sama ada hujah itu benar
menegaskanSalah Menyemak sama ada hujah itu palsu

Beberapa kaedah ini kelihatan berlebihan. Mengapa menggunakan assertSame(a, b) apabila anda hanya boleh menulis assertTrue(a == b) ?

Intinya ialah menegaskan adalah kaedah yang sangat bijak. Ia melakukan banyak perkara yang berguna, termasuk menulis maklumat ralat pada log . Dalam kes pertama, ia akan menulis bahawa objek A telah dijangka, tetapi objek B telah diterima. Dalam kes kedua, ia hanya akan menulis bahawa benar telah dijangka .

Apabila anda mempunyai beratus-ratus ujian, terutamanya yang dijalankan pada pelayan ujian khusus, mempunyai log terperinci boleh sangat membantu. Saya rasa awak faham maksud saya.

Contoh perbandingan tatasusunan:

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

    assertArrayEquals(expected, actual);
}

6.3 kaedah menegaskanSemua

Seperti yang dinyatakan di atas, kaedah assert bukan sahaja melakukan semakan, tetapi juga menulis banyak maklumat tentang objek yang setanding dengan log.

Mari 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 sepadan, maka selebihnya tidak akan diperiksa. Tetapi saya ingin ia masih berlaku dan keputusannya direkodkan dalam log. Tetapi pada masa yang sama, jika sekurang-kurangnya satu pemeriksaan gagal, maka ujian itu masih gagal.

Terdapat kaedah khas untuk ini - assertAll() . Sebagai hujah pertama, ia memerlukan komen untuk ditulis pada log, dan kemudian sebarang bilangan fungsi menegaskan.

Inilah cara contoh kami akan ditulis semula 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 tidak betul, 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 kaedah assertTimeout

Ingat anotasi @Timeout ? Ia dibenarkan untuk mengawal masa pelaksanaan keseluruhan kaedah. Tetapi kadangkala ia berguna untuk menetapkan sekatan ke atas pelaksanaan beberapa bahagian kod di dalam kaedah. Anda boleh menggunakan assertTimeout() untuk ini .

Masa berlalu sebagai parameter pertama, dan kod (fungsi) yang mesti dilaksanakan dalam masa yang ditentukan diluluskan sebagai yang kedua. Contoh:

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

Kelas Assert mempunyai 12 varian kaedah assertTimeout() . Jika anda ingin mengetahui lebih lanjut tentang mereka, selamat datang ke dokumentasi rasmi .

6.5 kaedah assertThrows

Selalunya terdapat situasi apabila anda perlu memastikan bahawa dalam situasi tertentu kod membuang pengecualian yang betul: ia mengesan ralat dan membuang pengecualian yang betul. Ini adalah keadaan yang sangat biasa.

Dalam kes ini, terdapat satu lagi kaedah penegasan yang berguna - ini ialah assertThrows() . Format umum panggilannya ialah:

assertThrows(exception , code)

Pada asasnya, ia sangat serupa dengan kaedah assertTimeout() , hanya ia menyemak bahawa kod yang ditentukan membuang pengecualian yang betul. Contoh:

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