NoraUI - 使用 customDataProvider 作为输入和输出时出现空指针异常
NoraUI - Null Pointer Exception while using a customDataProvider as Input and Output
当我尝试使用 CustomDataProvider 作为输入和输出时遇到问题。在场景中的某个时刻,抛出 NPE 异常。
编辑 1: 我已经读过 What is a NullPointerException, and how do I fix it?:我了解什么是 NPE 以及如何解决它。在我的案例中,我不明白的是为什么在执行的那一刻发生了一个事情,并且在我的案例中是针对这个特定的对象。我不是 NoraUI 框架的专家。当我查看现有的 dataProvider 时,它们从不操作 indexData 对象,所以我也没有。我不知道它们是如何处理的以及它们何时被初始化。这就是为什么我要问为什么现在会发生这种情况,以及我是否忘记了一些经验丰富的人的问题。抱歉,如果不清楚。这是一个与 NoraUI 框架相关的问题,而不是纯粹的 Java 问题。
异常:
CustomDataProvider 的 scenarioInitiator 执行进展顺利:数据生成良好并写入 Gherkin。但是就在场景启动的开始,抛出异常:
[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)
通过对调试的更多研究,似乎引发异常的确切行是[=35]的第一个构造函数中的for循环的条件=]noraui.exception.Result$成功 对象:
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;
}
}
我想它与 DataProvider 对象中声明的 IndexData 有关(它由 CustomDataProvider 扩展,而 CustomDataProvider 又由我的 customDataProvider 扩展)。但是我只是不明白为什么它会失败,因为在我的情况下我使用了 super 方法,就像其他常见的 DataProvider(Excel、DB 等)一样。
自定义数据提供者:
我的自定义数据提供程序启动多个查询,其中一些根据第一个查询的内容进行了修改 return。这些查询的最终结果存储在 ArrayList<ArrayList<String>> dataTable
变量中。数据行如下:| Offer | Product | Items | Results |
所以我的问题是:
为什么使用我的自定义数据提供程序会抛出此 NPE,而使用其他数据提供程序却不会。因为我没有看到他们中的任何一个有处理 DataIndex 的自定义方式。
您的问题似乎是由于这部分代码引起的:
getIndexData(Context.getCurrentScenarioData())
getIndexData returns 当前检索的值为空 Context.getCurrentScenarioData();
如果您创建了 DataInputProvider,您应该从 CommonDataProvider
扩展 class 并覆盖 getModel()
方法,如下所示:
/**
* {@inheritDoc}
*/
@Override
public Class<Model> getModel(String modelPackages) throws TechnicalException {
return null;
}
getNbLines()
方法也应该通过返回用作输入的数据行数(包括列名行)来重新定义。
其实Context
class需要这两个方法来初始化场景数据索引,用于写结果
希望这对您有所帮助
当我尝试使用 CustomDataProvider 作为输入和输出时遇到问题。在场景中的某个时刻,抛出 NPE 异常。
编辑 1: 我已经读过 What is a NullPointerException, and how do I fix it?:我了解什么是 NPE 以及如何解决它。在我的案例中,我不明白的是为什么在执行的那一刻发生了一个事情,并且在我的案例中是针对这个特定的对象。我不是 NoraUI 框架的专家。当我查看现有的 dataProvider 时,它们从不操作 indexData 对象,所以我也没有。我不知道它们是如何处理的以及它们何时被初始化。这就是为什么我要问为什么现在会发生这种情况,以及我是否忘记了一些经验丰富的人的问题。抱歉,如果不清楚。这是一个与 NoraUI 框架相关的问题,而不是纯粹的 Java 问题。
异常:
CustomDataProvider 的 scenarioInitiator 执行进展顺利:数据生成良好并写入 Gherkin。但是就在场景启动的开始,抛出异常:
[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)
通过对调试的更多研究,似乎引发异常的确切行是[=35]的第一个构造函数中的for循环的条件=]noraui.exception.Result$成功 对象:
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;
}
}
我想它与 DataProvider 对象中声明的 IndexData 有关(它由 CustomDataProvider 扩展,而 CustomDataProvider 又由我的 customDataProvider 扩展)。但是我只是不明白为什么它会失败,因为在我的情况下我使用了 super 方法,就像其他常见的 DataProvider(Excel、DB 等)一样。
自定义数据提供者:
我的自定义数据提供程序启动多个查询,其中一些根据第一个查询的内容进行了修改 return。这些查询的最终结果存储在 ArrayList<ArrayList<String>> dataTable
变量中。数据行如下:| Offer | Product | Items | Results |
所以我的问题是:
为什么使用我的自定义数据提供程序会抛出此 NPE,而使用其他数据提供程序却不会。因为我没有看到他们中的任何一个有处理 DataIndex 的自定义方式。
您的问题似乎是由于这部分代码引起的:
getIndexData(Context.getCurrentScenarioData())
getIndexData returns 当前检索的值为空 Context.getCurrentScenarioData();
如果您创建了 DataInputProvider,您应该从 CommonDataProvider
扩展 class 并覆盖 getModel()
方法,如下所示:
/**
* {@inheritDoc}
*/
@Override
public Class<Model> getModel(String modelPackages) throws TechnicalException {
return null;
}
getNbLines()
方法也应该通过返回用作输入的数据行数(包括列名行)来重新定义。
其实Context
class需要这两个方法来初始化场景数据索引,用于写结果
希望这对您有所帮助