Какой у вас опыт модульного (Unit) тестирования в Java?

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

Ответ

Имею практический опыт написания модульных тестов с использованием JUnit 5 и Mockito для изоляции тестируемого кода.

Типичная структура теста (Given-When-Then):

@Test
void getUserById_ShouldReturnUser_WhenUserExists() {
    // Given (Подготовка данных и моков)
    Long userId = 1L;
    User expectedUser = new User(userId, "John");
    when(userRepository.findById(userId)).thenReturn(Optional.of(expectedUser));

    // When (Вызов тестируемого метода)
    User actualUser = userService.getUserById(userId);

    // Then (Проверка утверждений и взаимодействий)
    assertNotNull(actualUser);
    assertEquals(expectedUser.getId(), actualUser.getId());
    verify(userRepository, times(1)).findById(userId); // Верификация вызова мока
}

Ключевые навыки и принципы:

  • Изоляция: Использование @Mock, @InjectMocks, Mockito.mock() для замены зависимостей (репозиториев, внешних сервисов).
  • Покрытие: Написание тестов для сервисного слоя, утилитных классов, сложной бизнес-логики.
  • Параметризованные тесты: Использование @ParameterizedTest и @CsvSource для проверки множества сценариев.
  • Принцип FIRST: Следование принципам Fast, Independent, Repeatable, Self-Validating, Timely.
  • Прагматичный подход: Фокус на покрытии критических путей и edge-кейсов, а не на достижении 100% coverage любой ценой.