6.1 твърди

Утвържденията са специални проверки , които могат да бъдат вмъкнати на различни места в codeа. Тяхната задача е да определят дали нещо се е объркало. Или по-скоро да проверя дали всичко върви Howто трябва. Това е „при необходимост“ и те ви позволяват да го зададете по различни начини.

Вече сте срещнали някои твърдения в codeа по-горе. Първият е проверка на обектите за equalsство. Ако обектите не са равни, ще бъде хвърлено изключение и тестът ще бъде неуспешен.

Редът на сравнението е важен тук , защото JUnit във финалния отчет ще напише нещо като „стойност 1 получена, но 3 се очакваше“. Общият формат за такава проверка е:

assertEquals(standard , meaning)

Пример:

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

    assertEquals(expected, actual);
}

6.2 Методи assertEquals, assertTrue, assertFalse

По-долу ще изброя най-популярните методи - твърдения. По имената им е напълно възможно да се познае How работят. Но все пак ще напиша кратко обяснение:

assertEquals Проверява дали два обекта са равни
assertArrayEquals Проверява дали два масива съдържат еднакви стойности
assertNotNull Проверява дали аргументът не е нула
assertNull Проверява дали аргументът е нула
assertNotSame Проверете дали двата аргумента не са един и същ обект
assertSame Проверете дали двата аргумента са един и същ обект
assertTrue Проверява дали аргументът е верен
assertFalse Проверява дали аргументът е неверен

Някои от тези методи изглеждат излишни. Защо да използвате assertSame(a, b) , когато можете просто да напишете assertTrue(a == b) ?

Въпросът е, че assert е много умен метод. Той прави много полезни неща, включително запис на информация за грешка в дневника . В първия случай ще пише, че се очаква обект A, но е получен обект B. Във втория случай просто ще пише, че се очаква true .

Когато имате стотици тестове, особено тези, които се изпълняват на специален тестов сървър, наличието на подробни регистрационни файлове може да бъде изключително полезно. Мисля, че разбирате Howво имам предвид.

Пример за сравнение на масиви:

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

    assertArrayEquals(expected, actual);
}

6.3 метод assertAll

Както бе споменато по-горе, методът assert не само извършва проверка, но също така записва много информация за сравними обекти в дневника.

Нека направим сравнение:

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

Но ако един от параметрите не съвпада, тогава останалите няма да бъдат проверени. Но бих искал те все още да се случват и резултатите им да се записват в дневника. Но в същото време, ако поне една проверка е неуспешна, тогава тестът все още е неуспешен.

Има специален метод за това - assertAll() . Като първи аргумент е необходимо да се запише коментар в дневника и след това произволен брой assert функции.

Ето How нашият пример ще бъде пренаписан с него:

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

След това, ако addressът е неправилен, нещо подобно ще бъде записано в дневника:

	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

Помните ли анотацията @Timeout ? Това позволява да се контролира времето за изпълнение на целия метод. Но понякога е полезно да зададете ограничения върху изпълнението на част от codeа вътре в метода. Можете да използвате assertTimeout() за това .

Времето се предава като първи параметър, а codeът (функцията), който трябва да бъде изпълнен в рамките на определеното време, се предава като втори. Пример:

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

Класът Assert има 12 варианта на метода assertTimeout() . Ако искате да научите повече за тях, добре дошли в официалната documentация .

6.5 метод assertThrows

Много често има ситуации, когато трябва да се уверите, че в определена ситуация codeът хвърля правилното изключение: той открива грешка и хвърля правилното изключение. Това е много често срещана ситуация.

В този случай има друг полезен assert метод - това е assertThrows() . Общият формат на неговото извикване е:

assertThrows(exception , code)

По принцип той е много подобен на метода assertTimeout() , само че проверява дали указаният code хвърля правилното изключение. Пример:

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