Какой у вас опыт работы со Stream API в Java в контексте тестирования?

«Какой у вас опыт работы со Stream API в Java в контексте тестирования?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В автотестах на Java я часто использую Stream API для обработки и проверки коллекций данных, что делает код более декларативным и читаемым.

Основные сценарии применения:

  1. Фильтрация и поиск элементов в результатах проверок.
    // Проверка, что в списке пользователей есть хотя бы один активный администратор
    List<User> allUsers = userRepository.findAll();
    boolean hasActiveAdmin = allUsers.stream()
        .filter(u -> u.getRole().equals(Role.ADMIN))
        .anyMatch(User::isActive);
    assertTrue("Should have at least one active admin", hasActiveAdmin);
  2. Сравнение коллекций, игнорируя порядок или преобразуя элементы.
    // Получаем список ID заказов из API-ответа и сравниваем с ожидаемым множеством
    List<OrderDto> orders = apiClient.getOrders();
    Set<Long> actualOrderIds = orders.stream()
                                     .map(OrderDto::getId)
                                     .collect(Collectors.toSet());
    assertEquals(expectedOrderIds, actualOrderIds);
  3. Агрегация данных для составных проверок.
    // Проверка общей суммы товаров в корзине
    List<CartItem> items = getCartItems();
    BigDecimal totalPrice = items.stream()
        .map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())))
        .reduce(BigDecimal.ZERO, BigDecimal::add);
    assertThat(totalPrice).isEqualByComparingTo("199.99");
  4. Группировка элементов для более сложных assertions.
    // Проверяем, что у каждого пользователя корректное количество связанных записей
    Map<String, Long> postsPerUser = blogPosts.stream()
        .collect(Collectors.groupingBy(Post::getAuthorEmail, Collectors.counting()));
    postsPerUser.forEach((email, count) -> {
        assertThat(count).as("Post count for " + email).isLessThanOrEqualTo(MAX_POSTS_PER_USER);
    });

    Stream API позволяет писать компактные и выразительные проверки, особенно когда нужно обработать результаты запросов к API или БД перед assertion.