в нашей компании есть привычка, что, когда сообщается об ошибке, мы делаем следующие шаги:
- Напишите модульный тест, который явно не проходит, показывая, что ошибка существует
- Исправить ошибку
- Перезапустите тест, чтобы убедиться, что ошибка исправлена
- Зафиксируйте исправление и тест, чтобы избежать регрессий в будущем
Теперь я наткнулся на устаревший код с очень простой ошибкой. Ситуация выглядит следующим образом:
public final class SomeClass {
...
public void someMethod(Parameter param) {
try {
if (param.getFieldValue("fieldName").equals("true")) { // Causes NullPointerException
...
}
} catch (Exception ex) {
log.warn("Troubles ...", ex);
}
}
}
Проблема в том, что fieldName
не является обязательным, поэтому, если его нет, вы получаете NPE. Очевидное исправление:
if ("true".equals(param.getFieldValue("fieldName"))) {
...
}
Мой вопрос заключается в том, как написать модульный тест для сбоя метода. Если я передаю сообщение, которое не содержит fieldName
, оно просто регистрирует NPE, но не завершается ошибкой ...
Вы можете подумать, что делает метод? Я могу проверить эффект, который имеет метод. К сожалению, он связывается с какой-то удаленной системой, поэтому для этого потребуется огромный интеграционный тест, который кажется излишним с такой маленькой и простой ошибкой.
Обратите внимание, что будет действительно трудно, если не невозможно, внести какие-либо изменения в код, которые непосредственно не вызывают ошибку. Поэтому изменение кода просто для упрощения тестирования, вероятно, не будет возможным. Это довольно страшный унаследованный код, и все очень боятся его трогать.