С какой версией JUnit вы работали?

Ответ

Работал с JUnit 5 (Jupiter), актуальной архитектурой для модульного тестирования. Для поддержки legacy-кода знаком и с JUnit 4.

Ключевые отличия JUnit 5 от JUnit 4:

  1. Архитектура: JUnit 5 состоит из трёх модулей (Jupiter, Vintage, Platform).
  2. Пакеты: Аннотации и классы в org.junit.jupiter.api.
  3. Новые аннотации: @BeforeAll, @AfterAll, @DisplayName.
  4. Улучшенные assertions: Поддержка лямбда-выражений, группировка.
  5. Параметризованные тесты: Через @ParameterizedTest с различными источниками данных (@CsvSource, @ValueSource).
  6. Динамические тесты: @TestFactory для генерации тестов в runtime.

Пример теста на JUnit 5:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {
    @Test
    @DisplayName("Сложение двух чисел")
    void additionTest() {
        assertEquals(4, Calculator.add(2, 2));
        assertThrows(IllegalArgumentException.class, 
                     () -> Calculator.add(null, 2));
    }
}

Для новых проектов рекомендуется JUnit 5 из-за его гибкости и активного развития.

Ответ 18+ 🔞

Э, слушай, вот сидишь такой, пишешь свой код, и тут бац — нужно его протестировать. А вокруг все носятся с этим JUnit 5, он же Jupiter. Архитектура у них там, блядь, трёхэтажная, как у честного бизнесмена: Jupiter, Vintage, Platform. Всё разложено по полочкам, не то что в старом добром JUnit 4, где всё в одной куче валялось, как носки после командировки.

А если влез в какой-нибудь legacy-проект, который ещё твои деды писали, то там, ясное дело, JUnit 4. И приходится вспоминать, как это — писать @Before вместо @BeforeEach. Чувствуешь себя археологом, ёпта, который откапывает древние артефакты в виде assertEquals(expected, actual).

Так в чём же, сука, разница-то основная? Давай по пунктам, а то мозг заплыл:

  1. Архитектура. Я уже говорил — не одна библиотека, а целый конструктор. Jupiter — это для новых тестов, Vintage — чтоб старые JUnit 4 тесты не выкидывать, а Platform — чтоб вся эта ебля в IDE и сборщиках запускалась. Умно, чо.
  2. Пакеты. Всё переехало. Раньше было org.junit, а теперь org.junit.jupiter.api. Запомнил? Нет? Ну и хуй с тобой, IDE сама подскажет, когда красным подчеркнёт.
  3. Аннотации новые. @BeforeAll и @AfterAll — это статические методы, которые один раз выполняются ДО и ПОСЛЕ ВСЕХ тестов. Не путать с @BeforeEach, который, как надоедливый комар, жужжит перед КАЖДЫМ тестом. А ещё есть @DisplayName — можно тест назвать человеческими словами, а не testAdditionWhenParamsAreNullThrowsException, блядь.
  4. Assertions. Тут вообще красота. Можно в assertTrue лямбду запихнуть, и если тест сломается, то в ошибке сразу твоё кастомное сообщение выведется, а не просто expected: true but was: false. Гениально и просто, как тапок по ебалу.
  5. Параметризованные тесты. Это просто песня, а не фича. Раньше надо было городить огород, а сейчас навесил @ParameterizedTest, накормил его данными через @CsvSource или @ValueSource, и он сам, сука, нагенерирует кучу тест-кейсов. Красота!
  6. Динамические тесты. @TestFactory — это для совсем ебанутых сценариев, когда тесты прямо во время выполнения (runtime) генерируются. Сам не часто пользовался, но знать надо — вдруг начальству понравится слово "динамический".

Ну и примерчик, чтобы глаза замылились:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {
    @Test
    @DisplayName("Сложение двух чисел")
    void additionTest() {
        assertEquals(4, Calculator.add(2, 2));
        assertThrows(IllegalArgumentException.class, 
                     () -> Calculator.add(null, 2));
    }
}

Видишь? Красиво, читаемо. assertThrows — это вообще лапочка, чтобы проверить, летит ли исключение, где надо.

Итог, блядь: если начинаешь новый проект — даже не думай, бери JUnit 5. Он гибкий, развивается, и с ним не стыдно. А JUnit 4... Ну, это как запасные кальсоны на случай, если в старом доме придётся ремонт делать. Есть — и хорошо.