Ответ
Я использую 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 — когда твоё приложение — это такой большой, сложный организм, и проверить надо не кусок, а всё сразу, с базой, контроллерами и прочей хуйней.
Вот и весь сказ. Пиши тесты, не ленись, а то потом в три часа ночи искать, почему всё накрылось медным тазом — то ещё удовольствие.