Какие фреймворки используются для автоматизации тестов в Java?

«Какие фреймворки используются для автоматизации тестов в Java?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор фреймворка зависит от типа тестов. Основные инструменты в экосистеме Java:

Юнит-тестирование:

  • JUnit 5 — стандарт де-факто. Поддерживает параметризованные тесты, расширения через @ExtendWith и отложенное выполнение (assertAll).
  • TestNG — альтернатива с расширенными возможностями: группы тестов, зависимости, параллельный запуск из коробки.

Мокирование и изоляция:

  • Mockito — наиболее популярный фреймворк для создания mock, stub и spy объектов. Позволяет проверять взаимодействия (verify).

Интеграционное и E2E тестирование:

  • Selenium WebDriver — для автоматизации UI веб-приложений. Управляет браузером через драйвер.
  • REST Assured — DSL для тестирования REST API. Упрощает валидацию JSON/XML ответов и статус-кодов.
  • Cucumber — для Behavior-Driven Development (BDD). Тесты пишутся на языке Gherkin в .feature файлах.

Типичные комбинации:

  • Unit-тесты: JUnit 5 + Mockito.
  • API-тесты: JUnit 5/TestNG + REST Assured.
  • UI-тесты: JUnit 5/TestNG + Selenium WebDriver.
  • BDD: Cucumber + JUnit (как раннер).

Пример unit-теста с JUnit 5 и Mockito:

@Test
@DisplayName("Should return user by id")
void shouldReturnUserById() {
    // Arrange
    User mockUser = new User(1L, "John");
    when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));

    // Act
    User result = userService.getUserById(1L);

    // Assert
    assertEquals("John", result.getName());
    verify(userRepository).findById(1L); // Проверка вызова
}

Пример теста API с REST Assured:

@Test
void testGetUserEndpoint() {
    given()
        .baseUri("https://api.example.com")
        .param("id", 123)
    .when()
        .get("/users")
    .then()
        .statusCode(200)
        .body("name", equalTo("Alice"))
        .body("age", greaterThan(18));
}