6.1 iginiit

Ang mga assert ay mga espesyal na tseke na maaaring ipasok sa iba't ibang lugar sa code. Ang kanilang gawain ay upang matukoy na may nangyaring mali. O sa halip, upang suriin na ang lahat ay nangyayari ayon sa nararapat. Ito ay "kung kinakailangan" at pinapayagan ka nilang itakda ito sa iba't ibang paraan.

Nakatagpo ka na ng ilang assertion sa code sa itaas. Ang una ay ang pagsuri sa mga bagay para sa pagkakapantay-pantay. Kung ang mga bagay ay hindi pantay, ang isang pagbubukod ay itatapon at ang pagsubok ay mabibigo.

Ang pagkakasunud-sunod ng paghahambing ay mahalaga dito , dahil ang JUnit sa huling ulat ay magsusulat ng isang bagay tulad ng "value 1 na natanggap, ngunit 3 ang inaasahan". Ang pangkalahatang format para sa naturang tseke ay:

assertEquals(standard , meaning)

Halimbawa:

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

    assertEquals(expected, actual);
}

6.2 Paraan assertEquals, assertTrue, assertFalse

Sa ibaba ay ililista ko ang mga pinakasikat na pamamaraan - mga pahayag. Sa pamamagitan ng kanilang mga pangalan ay lubos na posible na hulaan kung paano sila gumagana. Ngunit magsusulat pa rin ako ng maikling paliwanag:

assertEquals Sinusuri na ang dalawang bagay ay pantay
assertArrayEquals Sinusuri kung ang dalawang array ay naglalaman ng pantay na halaga
assertNotNull Sinusuri kung ang argumento ay hindi null
assertNull Sinusuri kung ang argumento ay null
assertNotSame Suriin na ang dalawang argumento ay hindi iisang bagay
igiitSame Suriin na ang dalawang argumento ay iisang bagay
igiitTotoo Sinusuri kung totoo ang argumento
igiit Mali Sinusuri kung mali ang argumento

Ang ilan sa mga pamamaraang ito ay tila kalabisan. Bakit gumamit ng assertSame(a, b) kapag maaari mo lamang isulat assertTrue(a == b) ?

Ang punto ay ang paggigiit ay isang napakatalino na pamamaraan. Gumagawa ito ng maraming kapaki-pakinabang na bagay, kabilang ang pagsusulat ng impormasyon ng error sa log . Sa unang kaso, isusulat nito na inaasahan ang object A, ngunit natanggap ang object B. Sa pangalawang kaso, isusulat lang nito na inaasahan ang true .

Kapag mayroon kang daan-daang mga pagsubok, lalo na ang mga tumatakbo sa isang nakatuong server ng pagsubok, ang pagkakaroon ng mga detalyadong log ay maaaring maging lubhang kapaki-pakinabang. Sa tingin ko naiintindihan mo ang ibig kong sabihin.

Halimbawa ng paghahambing ng array:

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

    assertArrayEquals(expected, actual);
}

6.3 igiit ang lahat ng paraan

Tulad ng nabanggit sa itaas, ang paraan ng paggiit ay hindi lamang nagsasagawa ng isang tseke, ngunit nagsusulat din ng maraming impormasyon tungkol sa maihahambing na mga bagay sa log.

Gumawa tayo ng paghahambing:

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

Ngunit kung ang isa sa mga parameter ay hindi tumutugma, ang iba ay hindi susuriin. Ngunit nais kong mangyari pa rin ang mga ito at maitala ang kanilang mga resulta sa log. Ngunit sa parehong oras, kung hindi bababa sa isang tseke ang nabigo, kung gayon ang pagsubok ay nabigo pa rin.

Mayroong isang espesyal na paraan para dito - assertAll() . Bilang unang argumento, kailangan ng komento upang maisulat sa log, at pagkatapos ay anumang bilang ng mga pag-andar na igiit.

Narito kung paano muling isusulat ang aming halimbawa kasama nito:

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

Pagkatapos kung ang address ay hindi tama, ang isang bagay na tulad nito ay isusulat sa 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 assertTimeout na paraan

Tandaan ang @Timeout annotation ? Pinapayagan nitong kontrolin ang oras ng pagpapatupad ng buong pamamaraan. Ngunit kung minsan ay kapaki-pakinabang na magtakda ng mga paghihigpit sa pagpapatupad ng ilang bahagi ng code sa loob ng pamamaraan. Maaari mong gamitin ang assertTimeout() para dito .

Ang oras ay naipasa bilang unang parameter, at ang code (function) na dapat isagawa sa loob ng tinukoy na oras ay ipinapasa bilang pangalawa. Halimbawa:

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

Ang Assert class ay may 12 variant ng assertTimeout() method . Kung gusto mong matuto nang higit pa tungkol sa kanila, maligayang pagdating sa opisyal na dokumentasyon .

6.5 paraan ng assertThrows

Kadalasan mayroong mga sitwasyon kung kailan kailangan mong tiyakin na sa isang tiyak na sitwasyon ang code ay nagtatapon ng tamang pagbubukod: nakakakita ito ng isang error at nagtatapon ng tamang pagbubukod. Ito ay isang napakakaraniwang sitwasyon.

Sa kasong ito, mayroong isa pang kapaki-pakinabang na paraan ng paggiit - ito ay assertThrows() . Ang pangkalahatang format ng tawag nito ay:

assertThrows(exception , code)

Karaniwan, ito ay halos kapareho sa paraan ng assertTimeout() , tinitingnan lamang nito na ang tinukoy na code ay nagtatapon ng tamang pagbubukod. Halimbawa:

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