2

当我尝试使用 CustomDataProvider 作为输入和输出时遇到问题。在场景中的某个时刻,会引发 NPE 异常。

编辑 1:我已经阅读了什么是 NullPointerException,我该如何解决?: 我了解什么是 NPE 以及如何解决它。在我的情况下,我不明白为什么在执行的那一刻发生了一件事情,并且在我的情况下是这个特定的对象。我不是 NoraUI 框架的专家。当我查看现有的 dataProvider 时,他们从不操作 indexData 对象,所以我也没有。我不知道它们是如何处理的以及它们何时被初始化。这就是为什么我要问这个问题为什么会发生在这个时候,以及我是否忘记了一些有更多经验的人。抱歉,如果不清楚。这是一个与 NoraUI 框架相关的问题,而不是纯 Java 的问题。

例外:

SceneInitiator 执行与 CustomDataProvider 顺利进行:数据很好地生成并写入 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)

通过对调试的更多研究,似乎引发异常的确切行是noraui.exception.Result$Success对象的第一个构造函数中for 循环的条件:

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 等)一样。

自定义数据提供者:

我的自定义数据提供程序启动多个查询,其中一些根据第一个查询返回的内容进行了修改。这些查询的最终结果存储在ArrayList<ArrayList<String>> dataTable变量中。数据行如下:| Offer | Product | Items | Results |

所以我的问题是:

为什么使用我的自定义数据提供程序会抛出此 NPE,而使用其他 DataProvider 却不会。因为我没有看到他们中的任何一个有处理 DataIndex 的自定义方式。

4

1 回答 1

2

由于这部分代码,您的问题似乎发生了:

getIndexData(Context.getCurrentScenarioData()) 

getIndexData 为当前检索到的 Context.getCurrentScenarioData() 返回 null;

如果您创建了一个 DataInputProvider,您应该扩展您的类CommonDataProvider并覆盖getModel()方法,如下所示:

/**
 * {@inheritDoc}
 */
@Override
public Class<Model> getModel(String modelPackages) throws TechnicalException {
    return null;
}

getNbLines()方法还应该通过返回用作输入的数据行数(包括列名行)来重新定义。

实际上,Context类中需要这两个方法来初始化用于写入结果的场景数据索引。

希望这会有所帮助

于 2017-08-16T13:11:37.397 回答