1. Підключаємо фреймворк JUnit

Для тестування Java-коду ми маємо шикарний фреймворк під назвою JUnit. Він відмінно працює, постійно оновлюється, дуже популярний і, звісно, з ним дуже щільно інтегрована Intellij IDEA.

Зараз усі користуються п'ятою версією цього фреймворку JUnit 5, хоча в багатьох проєктах ти ще можеш зустріти його четверту версію. Вони не сильно відрізняються, але ми все одно розглянемо новішу. Думаю, на той час, коли ти почнеш активно писати тести, ти схвалиш мій вибір.

Отже, як додати до проєкту JUnit? Після вивчення Maven це буде просто: просто додай цей код до свого pom.xml:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
	<version>5.8.1</version>
	<scope>test</scope>
</dependency>

До речі, якщо ти хочеш, щоб Maven на етапі складання (test stage) запустив твої тести, до pom.xml потрібно додати ще один фрагмент:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
	<version>2.19.1</version>
	<dependencies>
    	<dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.3.2</version>
    	</dependency>
	</dependencies>
</plugin>

2. Анотація @Test

Припустимо, у тебе є клас, який ти хочеш протестувати. Як це найкраще зробити? Давай почнемо з якогось прикладу, бо складно тестувати абстрактний клас :)

Скажімо, є клас Calculator, який вміє виконувати 4 базові операції: додавання, віднімання, множення та поділ. Напишемо його:


    class Calculator {
    	public int add(int a, int b) {
        	return a+b;
    	}

    	public int sub(int a, int b) {
        	return a-b;
    	}

    	public int mul (int a, int b) {
        	return a*b;
    	}

    	public int div(int a, int b) {
        	return a/b;
    	}
}

Ми хочемо протестувати методи цього класу. А раптом у майбутньому поміняють щось, і все перестане працювати. Як нам написати для нього тести?

Нам потрібно створити ще один клас. Для цього зазвичай беруть те саме ім'я і додають суфікс Test. До кожного методу потрібно додати хоча б один тестовий метод. Приклад:


    class CalculatorTest {
   	@Test
    	public void add() {
    	}
   	@Test
    	public void sub() {
        }
   	@Test
    	public void mul() {
    	}
   	@Test
    	public void div() {
    	}
}

Раніше існувала вимога, щоб ім'я методу починалося зі слова test, але тепер це не потрібно.

3. Приклади тестів JUnit

Давай напишемо кілька прикладів, у яких протестуємо методи нашого класу CalculatorTest:


	class CalculatorTest {
   	@Test
    	public void add() {
        	Calculator calc = new Calculator();
        	int result = calc.add(2, 3);
        	assertEquals(5, result);
    	}

   	@Test
    	public void sub() {
        	Calculator calc = new Calculator();
        	int result = calc.sub(10, 10);
        	assertEquals(0, result);
        }

   	@Test
    	public void mul() {
        	Calculator calc = new Calculator();
        	int result = calc.mul(-5, -3);
        	assertEquals(15, result);
    	}

   	@Test
    	public void div() {
        	Calculator calc = new Calculator();
        	int result = calc.div(2, 3);
        	assertEquals(0, result);
    	}
}

Ось так виглядає типовий тест із використанням JUnit. З цікавого: тут використовується спеціальний метод assertEquals(): він порівнює параметри, які до нього передаються, про що свідчить слово equals у його назві.

Якщо параметри, які передалися до assertEquals() не рівні між собою, метод кине виняток і тест буде вважатися проваленим. Цей виняток не завадить виконанню інших тестів.