Что случится, если передать null в Optional.of()?

«Что случится, если передать null в Optional.of()?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод Optional.of(value) выбросит NullPointerException сразу в момент вызова, если переданный value равен null.

Почему это важно для тестирования:

  1. Тестирование на NPE: Это поведение нужно проверять в unit-тестах для методов, которые используют Optional.of() и должны гарантировать не-null аргументы.
  2. Использование правильного метода: В коде, который обрабатывает потенциально 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.