Ответ
Геттеры — это основной способ проверки внутреннего состояния объекта в модульных и интеграционных тестах, не нарушая принцип инкапсуляции. Я использую их для ассертов и для извлечения данных в более сложных проверках.
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()) или это деталь реализации, которую не нужно тестировать напрямую.