Ответ
Модификатор public — это самый открытый уровень доступа. Класс, метод, конструктор или поле, объявленные как public, доступны из любого другого класса в программе, независимо от пакета или иерархии наследования.
Ключевая роль в тестировании: Публичный интерфейс класса — это его контракт с внешним миром. Именно этот интерфейс является основной мишенью для тестирования (как модульного, так и интеграционного).
Пример: публичный API сервиса, который нужно протестировать
// Класс, представляющий сервис корзины покупок. Его публичные методы — это точки входа для тестов.
public class ShoppingCartService {
private Map<Item, Integer> items = new HashMap<>();
// Публичный метод добавления товара. Должен быть протестирован.
public void addItem(Item item, int quantity) {
if (quantity <= 0) {
throw new IllegalArgumentException("Quantity must be positive");
}
items.merge(item, quantity, Integer::sum);
}
// Публичный метод расчета общей стоимости. Должен быть протестирован.
public double calculateTotal() {
return items.entrySet().stream()
.mapToDouble(entry -> entry.getKey().getPrice() * entry.getValue())
.sum();
}
// Публичный геттер для проверки состояния в тестах.
public int getItemQuantity(Item item) {
return items.getOrDefault(item, 0);
}
}
// Соответствующий интеграционный тест
class ShoppingCartServiceTest {
@Test
void testAddItemAndCalculateTotal() {
// Arrange
ShoppingCartService cart = new ShoppingCartService();
Item apple = new Item("Apple", 1.5);
Item banana = new Item("Banana", 0.8);
// Act
cart.addItem(apple, 3); // Тестируем публичный метод
cart.addItem(banana, 2); // Тестируем публичный метод
// Assert
assertEquals(3, cart.getItemQuantity(apple)); // Проверяем через публичный геттер
assertEquals(2, cart.getItemQuantity(banana));
// 3*1.5 + 2*0.8 = 4.5 + 1.6 = 6.1
assertEquals(6.1, cart.calculateTotal(), 0.001); // Тестируем публичный метод логики
}
}
Важность для QA: Чрезмерное использование public (например, для полей класса) нарушает инкапсуляцию, делает класс хрупким и усложняет тестирование, так как его состояние может быть изменено из множества мест непредсказуемо. Хорошая практика — минимизировать публичный интерфейс, предоставляя только необходимые для работы методы. Тестировщик фокусируется на этом минимальном и стабильном публичном API.