← Назад к вопросам

В чем разница между библиотеками 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 автодополнение: подсказывает доступные проверки

Сравнительная таблица

АспектJUnitMockitoAssertJ
НазначениеФреймворк тестовМоки/заглушкиAssertion библиотека
Основная задачаСтруктура, жизненный циклИзоляция зависимостейПроверка результатов
Типичный импорт@Test, assertEquals()@Mock, when()assertThat()
ЗаменаTestNGPowerMock, EasyMockHamcrest (старое)
СинтаксисИмперативныйДекларативный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-разработке используй все три вместе:

  1. JUnit — для структуры и управления тестами
  2. Mockito — для создания и управления зависимостями
  3. AssertJ — для выразительных и понятных проверок

Эта комбинация обеспечивает эффективное, чистое и поддерживаемое тестирование.

В чем разница между библиотеками Mockito, JUnit и AssertJ? | PrepBro