Это продолжение туториала по JUnit 5. Введение опубликовано здесь.

Утверждения (Assertions) JUnit 5 помогают сравнить ожидаемый результат с фактическим результатом теста. Для простоты все утверждения JUnit Jupiter являются статическими методами в классе org.junit.jupiter.Assertions.

Не успешные утверждения будет генерировать исключение AssertionFailedError или его подкласс.

Оглавление

  1. assertEquals() и assertNotEquals()

  2. assertArrayEquals()

  3. assertIterableEquals()

  4. assertLinesMatch()

  5. assertNotNull() и assertNull()

  6. assertNotSame() и assertSame()

  7. assertTimeout() и assertTimeoutPreemptively()

  8. assertTrue() и assertFalse)

  9. assertThrows()

  10. Пример fail()

1. assertEquals() и assertNotEquals()

Метод Assertions.assertEquals() используется для подтверждения того, что ожидаемое и фактическое значения равны. Метод assertEquals() ммеет много перегруженных методов для разных типов данных, например, int, short, float, char и т. д. Он также выдает сообщения об ошибках, которые будут напечатаны в случае если тест будет неуспешным. например

Перегруженные методы

public static void assertEquals(int expected, int actual)
public static void assertEquals(int expected, int actual, String message)
public static void assertEquals(int expected, int actual, Supplier<String< messageSupplier)

Примеры

void test() 
{
    //Тест пройдёт
    Assertions.assertEquals(4, Calculator.add(2, 2));
     
    //Тест не пройдёт
    Assertions.assertEquals(3, Calculator.add(2, 2), "Calculator.add(2, 2) test failed");
     
    //Тест не пройдёт
    Supplier<String> messageSupplier  = () -> "Calculator.add(2, 2) test failed";
    Assertions.assertEquals(3, Calculator.add(2, 2), messageSupplier);
}

Точно так же метод Assertions.assertNotEquals() используется для утверждения, что ожидаемое и фактическое значения НЕ равны. В отличие от метода assertEquals(), assertNotEquals() не содержит перегруженных методов для разных типов данных, а только параметр типа Object принимается.

Перегруженные методы

public static void assertNotEquals(Object expected, Object actual)
public static void assertNotEquals(Object expected, Object actual, String message)
public static void assertNotEquals(Object expected, Object actual, Supplier<String> messageSupplier)

Примеры

void test()
{
	//Тест пройдёт
	Assertions.assertNotEquals(3, Calculator.add(2, 2));

	//Тест не пройдёт
	Assertions.assertNotEquals(4, Calculator.add(2, 2), "Calculator.add(2, 2) test failed");

	//Тест не пройдёт
	Supplier<String> messageSupplier  = () -> "Calculator.add(2, 2) test failed";
	Assertions.assertNotEquals(4, Calculator.add(2, 2), messageSupplier);
}

2. assertArrayEquals()

Метод assertArrayEquals() утверждает, что ожидаемый и фактический массивы равны.

Он также имеет перегруженные методы для различных типов данных, например, boolean[], char[], int[] и т. д. Он также выдает сообщения об ошибках, которые будут напечатаны в случае сбоя теста. например

Перегруженные методы

public static void assertArrayEquals(int[] expected, int[] actual)
public static void assertArrayEquals(int[] expected, int[] actual, String message)
public static void assertArrayEquals(int[] expected, int[] actual, Supplier<String> messageSupplier)

Примеры

void testCase()
{
	//Тест пройдёт
	Assertions.assertArrayEquals(new int[]{1,2,3}, new int[]{1,2,3}, "Array Equal Test");

	//Тест не пройден, потому что порядок элементов отличается
	Assertions.assertArrayEquals(new int[]{1,2,3}, new int[]{1,3,2}, "Array Equal Test");

	//Тест не пройден, потому что количество элементов другое
	Assertions.assertArrayEquals(new int[]{1,2,3}, new int[]{1,2,3,4}, "Array Equal Test");
}

3. assertIterableEquals()

Метод assertIterableEquals() утверждает,, что ожидаемые и фактические итерации полностью равны. «Глубокое равенство» означает, что количество и порядок элементов в коллекции должны быть одинаковыми, а повторяющиеся элементы должны быть одинаковыми.

У него также есть три перегруженных метода.

Перегруженные методы

public static void assertIterableEquals(Iterable<?> expected, Iterable> actual)
public static void assertIterableEquals(Iterable<?> expected, Iterable> actual, String message)
public static void assertIterableEquals(Iterable<?> expected, Iterable> actual, Supplier<String> messageSupplier)

Примеры

@Test
void testCase()
{
     Iterable<Integer> listOne = new ArrayList<>(Arrays.asList(1,2,3,4));
     Iterable<Integer> listTwo = new ArrayList<>(Arrays.asList(1,2,3,4));
     Iterable<Integer> listThree = new ArrayList<>(Arrays.asList(1,2,3));
     Iterable<Integer> listFour = new ArrayList<>(Arrays.asList(1,2,4,3));

    //Тест пройдёт
    Assertions.assertIterableEquals(listOne, listTwo);

    //Тест не пройдёт
    Assertions.assertIterableEquals(listOne, listThree);

    //Тест не пройдёт
    Assertions.assertIterableEquals(listOne, listFour);
}

4. assertLinesMatch()

Он утверждает, что ожидаемый список строк соответствует фактическому списку. Логика сопоставления строки с другой строкой:

  1. проверьте, если expected.equals(actual) - если да, переходите к следующей паре

  2. в противном случае рассматривать expectedкак регулярное выражение и проверять переходString.matches(String) - если да, переходить к следующей паре

  3. в противном случае проверьте, является ли expected строка маркером быстрой перемотки вперед, если да, примените соответствующие строки быстрой перемотки вперед и перейдите к 1.

Допустимый маркер быстрой перемотки вперед - это строка, которая начинается и заканчивается >> и содержит не менее четырех символов. Любой символ между литералами быстрой перемотки вперед отбрасывается.

>>>>
>> stacktrace >>
>> single line, non Integer.parse()-able comment >>

5. assertNotNull() и assertNull()

AssertNotNull() утверждает, что фактическое значение НЕ равно нулю. Точно так же метод assertNull() утверждает, что это действительно так null. У обоих есть три перегруженных метода.

Перегруженные методы

public static void assertNotNull(Object actual)
public static void assertNotNull(Object actual, String message)
public static void assertNotNull(Object actual, Supplier<String> messageSupplier)
public static void assertEquals(Object actual)
public static void assertEquals(Object actual, String message)
public static void assertEquals(Object actual, Supplier<String> messageSupplier)

Примеры

@Test
void testCase()
{
	String nullString = null;
	String notNullString = "howtodoinjava.com";

	//Test will pass
	Assertions.assertNotNull(notNullString);

	//Test will fail
	Assertions.assertNotNull(nullString);

	//Test will pass
	Assertions.assertNull(nullString);

	// Test will fail
	Assertions.assertNull(notNullString);
}

6. assertNotSame() и assertSame()

assertNotSame() утверждает, что ожидаемый и фактический не относятся к одному объекту. Точно так же метод assertSame() утверждает, что ожидаемый и фактический относятся к одному и тому же объекту.

У обоих есть три перегруженных метода.

Перегруженные методы

public static void assertNotSame(Object expected, Object actual)
public static void assertNotSame(Object expected, Object actual, String message)
public static void assertNotSame(Object expected, Object actual, Supplier<> messageSupplier)
public static void assertSame(Object expected, Object actual)
public static void assertSame(Object expected, Object actual, String message)
public static void assertSame(Object expected, Object actual, Supplier<String> messageSupplier)

Примеры

@Test
void testCase()
{
	String originalObject = "howtodoinjava.com";
	String cloneObject = originalObject;
	String otherObject = "example.com";

	//Test will pass
	Assertions.assertNotSame(originalObject, otherObject);

	//Test will fail
	Assertions.assertNotSame(originalObject, cloneObject);

	//Test will pass
	Assertions.assertSame(originalObject, cloneObject);

	// Test will fail
	Assertions.assertSame(originalObject, otherObject);
}

7. assertTimeout() и assertTimeoutPreemptively()

Методы assertTimeout() и assertTimeoutPreemptively() используются для тестирования долго выполняющихся задач. Если заданная задача в тесте занимает больше указанной продолжительности, тест завершится неудачно.

Единственная разница между обоими методами заключается в том, что в assertTimeoutPreemptively() выполнение Executable или ThrowingSupplier будет прервано с упреждением при превышении тайм-аута. В случае assertTimeout(), Executable или ThrowingSupplierне будет прервана.

Перегруженные методы

public static void assertTimeout(Duration timeout, Executable executable)
public static void assertTimeout(Duration timeout, Executable executable, String message)
public static void assertTimeout(Duration timeout, Executable executable, Supplier<String> messageSupplier)
public static void assertTimeout(Duration timeout, ThrowingSupplier<T> supplier, String message)
public static void assertTimeout(Duration timeout, ThrowingSupplier<T> supplier, Supplier<String> messageSupplier)

Примеры

@Test
void testCase() {

	//This will pass
	Assertions.assertTimeout(Duration.ofMinutes(1), () -> {
		return "result";
	});

	//This will fail
	Assertions.assertTimeout(Duration.ofMillis(100), () -> {
		Thread.sleep(200);
		return "result";
	});

	//This will fail
	Assertions.assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
		Thread.sleep(200);
		return "result";
	});
}

8. assertTrue() и assertFalse()

Метод assertTrue()утверждает, что предоставленное условие истинно или предоставленное логическое условие BooleanSupplier истинно.

Точно так же assertFalse() утверждает, что предоставленное условие ложно.

У обоих есть следующие перегруженные методы:

Перегруженные методы

public static void assertTrue(boolean condition)
public static void assertTrue(boolean condition, String message)
public static void assertTrue(boolean condition, Supplier<String> messageSupplier)
public static void assertTrue(BooleanSupplier booleanSupplier)
public static void assertTrue(BooleanSupplier booleanSupplier, String message)
public static void assertTrue(BooleanSupplier booleanSupplier, Supplier<String> messageSupplier)
public static void assertFalse(boolean condition)
public static void assertFalse(boolean condition, String message)
public static void assertFalse(boolean condition, Supplier<String> messageSupplier)
public static void assertFalse(BooleanSupplier booleanSupplier)
public static void assertFalse(BooleanSupplier booleanSupplier, String message)
public static void assertFalse(BooleanSupplier booleanSupplier, Supplier<String> messageSupplier)

Примеры

@Test
void testCase() {

	boolean trueBool = true;
	boolean falseBool = false;

	Assertions.assertTrue(trueBool);
	Assertions.assertTrue(falseBool, "test execution message");
	Assertions.assertTrue(falseBool, AppTest::message);
	Assertions.assertTrue(AppTest::getResult, AppTest::message);

	Assertions.assertFalse(falseBool);
	Assertions.assertFalse(trueBool, "test execution message");
	Assertions.assertFalse(trueBool, AppTest::message);
	Assertions.assertFalse(AppTest::getResult, AppTest::message);
}

private static String message () {
	return "Test execution result";
}

private static boolean getResult () {
	return true;
}

9. assertThrows()

assetThrows()утверждает, что исполнение подаваемы Executable генерирует исключение из expectedTypeи возвращает исключение.

Перегруженные методы

public static <T extends Throwable> T assertThrows(Class<T> expectedType, 
	Executable executable)

Примеры

@Test
void testCase() {

	Throwable exception = Assertions.assertThrows(IllegalArgumentException.class, () -> {
        throw new IllegalArgumentException("error message");
    });
}

10. Пример fail() 

Метод fail() делает тест неуспешным. Он имеет следующие перегруженные методы:

Перегруженные методы

public static void fail(String message)
public static void fail(Throwable cause)
public static void fail(String message, Throwable cause)
public static void fail(Supplier<String> messageSupplier)

Примеры

public class AppTest {
	@Test
	void testCase() {

		Assertions.fail("not found good reason to pass");
		Assertions.fail(AppTest::message);
	}

	private static String message () {
		return "not found good reason to pass";
	}
}

Хорошего изучения!!!

Комментарии (2)


  1. isicju
    27.11.2021 02:39

    спасибо за статью


  1. aleksandy
    27.11.2021 11:36
    +4

    Горшочек, не вари.