Какую версию JUnit вы используете и почему?

Ответ

Я использую JUnit 5 (Jupiter) — это современная, модульная платформа для тестирования на Java.

Ключевые преимущества JUnit 5 перед JUnit 4:

  • Поддержка Java 8+: лямбда-выражения, @ParameterizedTest, @TestFactory для динамических тестов.
  • Модульная архитектура: junit-jupiter-api (для написания), junit-jupiter-engine (для запуска).
  • Улучшенные аннотации: @BeforeEach, @AfterEach вместо @Before, @After.
  • Расширяемость: модель расширений (@ExtendWith) вместо правил (@Rule).
  • Улучшенные утверждения (Assertions): поддерживают лямбды для ленивых сообщений об ошибках.

Пример теста:

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

class CalculatorTest {
    @Test
    @DisplayName("Сложение двух чисел")
    void additionTest() {
        assertEquals(4, Calculator.add(2, 2), "2 + 2 должно равняться 4");
    }

    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3})
    void isPositive_ParameterizedTest(int number) {
        assertTrue(number > 0, () -> number + " должно быть положительным");
    }
}

Сопутствующие библиотеки:

  • AssertJ — для fluent-assertions, повышающих читаемость.
  • Mockito — для мокирования.
  • Spring Boot Test — для интеграционного тестирования Spring-приложений.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши тесты, блядь. Сидит человек, пишет код, а потом ещё и проверять его надо, как будто мало, что он уже работает. Но без этого — никуда, пиздец.

Так вот, есть у нас JUnit 5, он же Jupiter. Это не тот старый дед, который ворчит, а новый, бодрый, на лямбдах катается. После четвёртой версии — просто небо и земля, ёпта.

Чем он, сука, так хорош?

  • Под Java 8 и выше заточен. Лямбды, параметризованные тесты (@ParameterizedTest), динамические тесты — вся эта современная хуйня, которая жизнь облегчает.
  • Разобрали на модули, как конструктор. Есть junit-jupiter-api — чтобы тесты писать, и junit-jupiter-engine — чтобы их, собственно, запускать. Всё чётко, ничего лишнего.
  • Аннотации поумнели. @BeforeEach и @AfterEach вместо старых @Before и @After. Звучит логичнее, сразу понятно, что перед каждым тестом, а не раз в жизни.
  • Расширяемость на уровне. Вместо этих кривых @Rule теперь есть нормальная модель расширений через @ExtendWith. Красота.
  • Утверждения (Assertions) стали адекватнее. Можно лямбду в сообщение об ошибке запихнуть, и оно будет вычисляться только если тест упал. Лениво, но эффективно, блядь.

Смотри, как это выглядит в коде (его не трогаем, он святой):

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

class CalculatorTest {
    @Test
    @DisplayName("Сложение двух чисел")
    void additionTest() {
        assertEquals(4, Calculator.add(2, 2), "2 + 2 должно равняться 4");
    }

    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3})
    void isPositive_ParameterizedTest(int number) {
        assertTrue(number > 0, () -> number + " должно быть положительным");
    }
}

А ещё, блядь, с ним часто в одной упряжке тащат:

  • AssertJ — чтобы утверждения писать, как стихи, длинными и красивыми цепочками. Читаемость — овердохуища.
  • Mockito — ну это классика, чтобы подменять одни объекты другими и смотреть, как они между собой ебутся.
  • Spring Boot Test — когда твоё приложение — это такой большой, сложный организм, и проверить надо не кусок, а всё сразу, с базой, контроллерами и прочей хуйней.

Вот и весь сказ. Пиши тесты, не ленись, а то потом в три часа ночи искать, почему всё накрылось медным тазом — то ещё удовольствие.