Что такое nullable типы в Kotlin и как с ними работать
Что проверяют
Для автоматизатора это вопрос про надёжность тестов. Падение с NullPointerException в автотесте выглядит как баг продукта, съедает время на разбор и подрывает доверие к прогону, поэтому важно, отличаете ли вы отсутствие значения от ошибки.
Как отвечать
В Kotlin тип по умолчанию не принимает null, для необязательного значения пишут String?. Компилятор не даст обратиться к такому значению напрямую, и дальше выбирают способ: ?. для безопасного вызова, ?: для значения по умолчанию или раннего выхода, ?.let для блока, нужного только при наличии значения, as? для безопасного приведения типа. Для коллекций удобны orEmpty и filterNotNull.
В тестовом коде отдельная роль у осознанного падения: если элемента нет, тест обязан упасть с понятным текстом, а не с NPE в середине объекта страницы.
val row = table.rows.firstOrNull { it.id == id }
?: error("Строка с идентификатором $id не найдена")
assertThat(row.status).isEqualTo(expected)Обязательно скажите про платформенные типы. Драйверы и клиенты для веба и мобильных приложений написаны на Java, и их методы часто приходят без разметки допустимости null: компилятор пропускает такое значение без проверки, а пустота всплывает уже при исполнении.
Где спотыкаются
Ставят двойной восклицательный знак везде, где ругается компилятор. Тест падает, но сообщение не говорит ничего: непонятно, элемент не найден, страница не загрузилась или данные не создались. Функция requireNotNull с текстом и обычные утверждения решают ту же задачу и экономят разбор.
Путают lateinit и допустимость null. Первое для драйвера и объектов страниц, которые создаются в подготовке теста; если значение действительно может отсутствовать, нужен вопросительный знак. Обращение до инициализации даёт своё исключение, а его принимают за обычный NPE.
Проверяют на null уже после присваивания значения из Java-кода в непустой тип. Падение случается в момент присваивания, а не там, где стоит проверка, и стектрейс указывает на строку, которая выглядит безобидно.