NoraUI - исключение нулевого указателя при использовании customDataProvider в качестве входных и выходных данных
У меня есть проблема, когда я пытаюсь использовать CustomDataProvider в качестве ввода и вывода. В какой-то момент в сценарии выдается исключение NPE.
Изменить 1: Я уже прочитал Что такое исключение NullPointerException, и как я могу это исправить? Я понимаю, что такое NPE и как его решить. Что я не понимаю в моем случае, так это то, почему в этот момент происходит событие, и с этим конкретным объектом в моем случае. Я не эксперт по NoraUI Framework. Когда я смотрел на существующий dataProvider, они никогда не манипулировали объектом indexData, поэтому я тоже этого не делал. Я не знаю, как они обрабатываются и когда они инициализируются. Вот почему я задаю вопрос о том, почему это происходит в данный момент, и если я что-то забыл кому-то с большим опытом. Извините, если не было понятно. этот вопрос больше связан с NoraUI Framework, чем с чисто Java.
Исключение:
Выполнение sceneInitiator идет хорошо с CustomDataProvider: данные хорошо генерируются и пишутся на корнишоне. Но только в начале запуска сценария выдается исключение:
[2017-08-16 15:37:28]: ********************************************************************************************************
[2017-08-16 15:37:28]: * *
[2017-08-16 15:37:28]: * Scénario: [@scenario] étape 1 sur 0 avec 0 erreur(s) et 0 alerte(s). Il reste 0s *
[2017-08-16 15:37:28]: * *
[2017-08-16 15:37:28]: ********************************************************************************************************
Failed scenarios:
steps/scenarios/scenario.feature:4 # Scenario: scenario
1 Scenarios (1 failed)
28 Steps (28 skipped)
5m52.930s
java.lang.NullPointerException
at noraui.exception.Result$Success.<init>(Result.java:32)
at noraui.application.steps.CucumberHooks.setUpScenario(CucumberHooks.java:44)
После небольшого исследования отладки кажется, что точная строка, вызывающая исключение, является условием цикла for в первом конструкторе объекта noraui.exception.Result$Success:
public static class Success<O> extends Result {
private final O object;
private static final Logger logger = Logger.getLogger(Success.class.getName());
public Success(O object, String message) throws TechnicalException {
this.object = object;
this.message = message;
for (Integer i : Context.getDataInputProvider().getIndexData(Context.getCurrentScenarioData()).getIndexes()) {
Context.getDataOutputProvider().writeSuccessResult(i);
}
logger.info(message + " [" + success() + "]");
}
public O success() {
Optional<O> o = Optional.ofNullable(object);
return o.isPresent() ? o.get() : null;
}
}
Я предполагаю, что это как-то связано с IndexData, объявленным в объекте DataProvider (который расширяется с помощью CustomDataProvider, который, в свою очередь, расширяется моим customDataProvider). Но я просто не понимаю, почему он потерпит неудачу, так как в моем случае я использовал метод super, как и другой обычный DataProvider (Excel, DB и т. Д.).
Пользовательский поставщик данных:
Мой пользовательский провайдер данных запускает несколько запросов, некоторые из которых изменяются в зависимости от того, что возвращает первый запрос. Окончательный результат этих запросов сохраняется в ArrayList<ArrayList<String>> dataTable
переменная. строка данных следующая: | Offer | Product | Items | Results |
Итак, мой вопрос:
Почему при использовании моего пользовательского поставщика данных этот NPE выбрасывается, а с другим DataProvider - нет. Поскольку я не вижу ни одного из них, имеющих собственный способ обработки DataIndex.
1 ответ
Ваша проблема, кажется, возникает из-за этой части кода:
getIndexData(Context.getCurrentScenarioData())
getIndexData возвращает значение null для текущего полученного Context.getCurrentScenarioData();
Если вы создали DataInputProvider, вы должны расширить свой класс с CommonDataProvider
и переопределить getModel()
метод следующим образом:
/**
* {@inheritDoc}
*/
@Override
public Class<Model> getModel(String modelPackages) throws TechnicalException {
return null;
}
getNbLines()
Метод также должен быть переопределен путем возврата количества строк данных, используемых в качестве входных данных (включая строку имен столбцов).
На самом деле, эти два метода необходимы в Context
класс для инициализации индексов данных сценариев, которые используются для записи результатов.
Надеюсь, что это помогает