Ответ
Метод Optional.of(value) выбросит NullPointerException сразу в момент вызова, если переданный value равен null.
Почему это важно для тестирования:
- Тестирование на NPE: Это поведение нужно проверять в unit-тестах для методов, которые используют
Optional.of()и должны гарантировать не-null аргументы. - Использование правильного метода: В коде, который обрабатывает потенциально
nullзначения (например, данные из внешнего источника или БД), необходимо использоватьOptional.ofNullable(value). Это ключевое различие.
Примеры и тесты:
import org.junit.jupiter.api.Test;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
public class OptionalTest {
// ТЕСТ 1: Проверка, что Optional.of(null) кидает NPE
@Test
void of_ShouldThrowNPE_WhenValueIsNull() {
// Используем assertThrows для проверки исключения
assertThrows(NullPointerException.class, () -> {
Optional<String> opt = Optional.of(null); // Здесь упадет
});
}
// ТЕСТ 2: Демонстрация безопасной работы с ofNullable
@Test
void ofNullable_ShouldHandleNull() {
String potentiallyNullValue = getValueFromExternalService(); // Может вернуть null
// Безопасное создание Optional
Optional<String> safeOpt = Optional.ofNullable(potentiallyNullValue);
if (safeOpt.isPresent()) {
System.out.println("Value: " + safeOpt.get());
} else {
System.out.println("Value is absent (null)");
// Альтернатива: String result = safeOpt.orElse("default");
}
// Утверждение: для null значения Optional должен быть пустым
assertTrue(safeOpt.isEmpty()); // Если getValueFromExternalService() вернул null
}
private String getValueFromExternalService() {
// Имитация внешнего вызова
return Math.random() > 0.5 ? "data" : null;
}
}
Вывод для QA-разработчика на Java: Всегда анализируйте, откуда приходят данные в метод, создающий Optional. Если есть малейший шанс на null, используйте ofNullable(). В автотестах покрывайте оба сценария — с валидными данными и с null.