Что такое JUnit?

JUnit — это стандартный фреймворк для модульного тестирования Java-приложений. Он предоставляет аннотации, утверждения и механизмы для создания и выполнения тестов, поддерживая методологию Test-Driven Development (TDD).

Основные версии JUnit

  • JUnit 4 — использует аннотации, широко распространён
  • JUnit 5 (Jupiter) — современная архитектура, лямбда-поддержка
  • JUnit Vintage — обратная совместимость с JUnit 3/4

Установка и настройка

Добавление зависимости в Maven:

1<dependency>
2    <groupId>org.junit.jupiter</groupId>
3    <artifactId>junit-jupiter</artifactId>
4    <version>5.9.2</version>
5    <scope>test</scope>
6</dependency>

Для Gradle:

1testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'

Пример простого теста

 1import org.junit.jupiter.api.Test;
 2import org.junit.jupiter.api.BeforeEach;
 3import org.junit.jupiter.api.DisplayName;
 4import static org.junit.jupiter.api.Assertions.*;
 5
 6class CalculatorTest {
 7    
 8    private Calculator calculator;
 9    
10    @BeforeEach
11    void setUp() {
12        calculator = new Calculator();
13    }
14    
15    @Test
16    @DisplayName("Проверка сложения двух чисел")
17    void testAddition() {
18        assertEquals(5, calculator.add(2, 3));
19        assertEquals(0, calculator.add(-1, 1));
20    }
21    
22    @Test
23    void testDivisionByZero() {
24        assertThrows(ArithmeticException.class, 
25            () -> calculator.divide(10, 0));
26    }
27}

Основные аннотации JUnit 5

  • @Test — помечает метод как тест
  • @BeforeEach — выполняется перед каждым тестом
  • @AfterEach — выполняется после каждого теста
  • @BeforeAll — выполняется один раз перед всеми тестами
  • @AfterAll — выполняется один раз после всех тестов
  • @DisplayName — человекочитаемое имя теста
  • @ParameterizedTest — параметризованные тесты

Утверждения (Assertions)

 1// Базовые утверждения
 2assertEquals(expected, actual);
 3assertTrue(condition);
 4assertFalse(condition);
 5assertNull(object);
 6assertNotNull(object);
 7
 8// Групповые утверждения
 9assertAll("person",
10    () -> assertEquals("John", person.getFirstName()),
11    () -> assertEquals("Doe", person.getLastName())
12);

Преимущества JUnit

  • Стандарт де-факто для Java-тестирования
  • Интеграция со всеми популярными IDE
  • Поддержка параметризованных и динамических тестов
  • Расширяемость через Extensions API
  • Отличная интеграция с CI/CD системами

Рекомендации по использованию

  • Следуй принципу AAA: Arrange, Act, Assert
  • Пиши независимые тесты, которые можно выполнять в любом порядке
  • Используй осмысленные имена тестов и @DisplayName
  • Группируй связанные тесты в отдельные классы

FAQ

В чём разница между JUnit 4 и JUnit 5?

JUnit 5 имеет модульную архитектуру, поддерживает лямбда-выражения, динамические тесты и предоставляет более богатый API для создания расширений.

Можно ли использовать JUnit для интеграционных тестов?

Да, JUnit подходит для интеграционных тестов, особенно в сочетании с Spring Boot Test и Testcontainers.