← Назад к вопросам
В чем разница между библиотеками Mockito, JUnit и AssertJ?
1.0 Junior🔥 251 комментариев
#Тестирование
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между Mockito, JUnit и AssertJ
Эти три библиотеки — краеугольные камни современного unit-тестирования на Java, но каждая решает свою задачу в контексте разработки и проверки качества кода.
JUnit: Фреймворк для написания тестов
JUnit — это основной тестовый фреймворк, который определяет структуру и жизненный цикл тестов.
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void testAddition() {
int result = calculator.add(2, 3);
assertEquals(5, result); // Встроенный assertion
}
@Test
void testDivisionByZero() {
assertThrows(ArithmeticException.class,
() -> calculator.divide(10, 0));
}
}
Роль JUnit:
- Определяет жизненный цикл тестов (@Test, @BeforeEach, @AfterEach)
- Обеспечивает базовые assertions (assertEquals, assertTrue, assertThrows)
- Интегрируется с IDE и CI/CD системами
- Организует запуск тестов
Mockito: Создание мок-объектов
Mockito позволяет создавать мок-объекты (mock objects) для изоляции тестируемого кода от его зависимостей.
import org.mockito.Mock;
import org.mockito.InjectMocks;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void testGetUserById() {
// Arrange: подготавливаем мок
User mockUser = new User(1, "John");
when(userRepository.findById(1))
.thenReturn(Optional.of(mockUser));
// Act: выполняем операцию
User result = userService.getUserById(1);
// Assert: проверяем результат и взаимодействия
assertEquals("John", result.getName());
verify(userRepository).findById(1);
}
@Test
void testRepositoryCallCount() {
when(userRepository.findById(any()))
.thenReturn(Optional.empty());
userService.getUserById(1);
userService.getUserById(2);
// Проверяем, что метод вызван именно 2 раза
verify(userRepository, times(2)).findById(any());
}
}
Возможности Mockito:
- Создание mock-объектов с помощью @Mock
- Настройка поведения (when/thenReturn)
- Проверка вызовов методов (verify)
- Использование аргументов-матчеров (any(), eq())
- Проверка порядка вызовов (inOrder)
AssertJ: Fluent assertions
AssertJ предоставляет выразительный и читаемый способ написания проверок с методом цепочки.
import static org.assertj.core.api.Assertions.*;
public class PersonTest {
@Test
void testPersonAssertions() {
Person person = new Person("Alice", 30, "alice@example.com");
// AssertJ: очень читаемо
assertThat(person.getName())
.isNotBlank()
.isEqualTo("Alice")
.hasLength(5);
assertThat(person.getAge())
.isPositive()
.isBetween(18, 100);
}
@Test
void testCollectionAssertions() {
List<String> fruits = Arrays.asList("apple", "banana", "cherry");
assertThat(fruits)
.hasSize(3)
.contains("apple", "banana")
.doesNotContain("orange")
.allMatch(s -> s.length() > 0);
}
@Test
void testExceptionAssertions() {
assertThatThrownBy(() -> {
throw new IllegalArgumentException("Invalid input");
})
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Invalid input")
.hasMessageContaining("Invalid");
}
}
Преимущества AssertJ:
- Fluent interface: метод за методом для читаемости
- Лучшие сообщения об ошибках: точно показывает, что не прошло
- Больше assertions: для коллекций, дат, файлов, чисел
- IDE автодополнение: подсказывает доступные проверки
Сравнительная таблица
| Аспект | JUnit | Mockito | AssertJ |
|---|---|---|---|
| Назначение | Фреймворк тестов | Моки/заглушки | Assertion библиотека |
| Основная задача | Структура, жизненный цикл | Изоляция зависимостей | Проверка результатов |
| Типичный импорт | @Test, assertEquals() | @Mock, when() | assertThat() |
| Замена | TestNG | PowerMock, EasyMock | Hamcrest (старое) |
| Синтаксис | Императивный | Декларативный | Fluent/Chain |
Полный пример: вместе
public class OrderServiceTest {
@Mock
private PaymentGateway paymentGateway;
@InjectMocks
private OrderService orderService;
@Test
void testSuccessfulPayment() {
// Mockito: подготавливаем мок
when(paymentGateway.charge(100.0))
.thenReturn(true);
// Act
boolean success = orderService.processPayment(100.0);
// AssertJ: проверяем результат красиво
assertThat(success)
.as("Payment should be successful")
.isTrue();
// Mockito: проверяем взаимодействие
verify(paymentGateway).charge(100.0);
}
}
Итоговая рекомендация
В современной Java-разработке используй все три вместе:
- JUnit — для структуры и управления тестами
- Mockito — для создания и управления зависимостями
- AssertJ — для выразительных и понятных проверок
Эта комбинация обеспечивает эффективное, чистое и поддерживаемое тестирование.