Как вы используете геттеры (getter methods) в процессе тестирования?

«Как вы используете геттеры (getter methods) в процессе тестирования?» — вопрос из категории ООП, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Геттеры — это основной способ проверки внутреннего состояния объекта в модульных и интеграционных тестах, не нарушая принцип инкапсуляции. Я использую их для ассертов и для извлечения данных в более сложных проверках.

1. Проверка состояния объекта после действия (Unit-тестирование):

// Тестируемый класс
public class ShoppingCart {
    private List<Item> items = new ArrayList<>();

    public void addItem(Item item) {
        items.add(item);
    }

    public List<Item> getItems() { // Геттер для тестирования
        return new ArrayList<>(items); // Возвращаем копию для безопасности
    }
}

// Тест
@Test
public void addItem_ShouldIncreaseCartSize() {
    ShoppingCart cart = new ShoppingCart();
    Item testItem = new Item("Book", 19.99);

    cart.addItem(testItem);

    // Используем геттер для проверки
    List<Item> itemsInCart = cart.getItems();
    assertEquals(1, itemsInCart.size());
    assertTrue(itemsInCart.contains(testItem));
}

2. Извлечение данных для комплексных ассертов (например, в API-тестах):

// После вызова API, который возвращает DTO
UserProfileDto profile = userApiClient.getProfile(123);

// Используем геттеры для построения детальных проверок
assertThat(profile.getEmail()).endsWith("@company.com");
assertThat(profile.getSettings().getNotificationPreferences())
    .contains("EMAIL");
assertThat(profile.getLastLogin()).isAfter(LocalDateTime.now().minusDays(7));

3. Важные нюансы в контексте тестирования:

  • Не тестируйте геттеры/сеттеры сами по себе. Это считается тривиальным кодом. Их корректность проверяется косвенно, через тесты бизнес-логики.
  • Защитное копирование: Если геттер возвращает mutable-объект (как List в первом примере), важно возвращать копию, чтобы тесты не могли неожиданно изменить состояние тестируемого объекта.
  • Отсутствие геттера — сигнал: Если для теста критически нужен геттер, а его нет, это повод обсудить с разработчиками: возможно, проверяемое состояние должно быть видимо через другой публичный метод (например, cart.isEmpty()) или это деталь реализации, которую не нужно тестировать напрямую.