Подключаем фреймворк 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>

Аннотация @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, но теперь это не нужно.

Примеры тестов 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(), неравны, то метод кинет исключение и тест будет считаться проваленным. Это исключение не помешает выполнению остальных тестов.