代码之家  ›  专栏  ›  技术社区  ›  N. Marchetto

NoraUI-将customDataProvider用作输入和输出时出现空指针异常

  •  2
  • N. Marchetto  · 技术社区  · 7 年前

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

    我已经读过了 What is a NullPointerException, and how do I fix it? :我了解什么是NPE以及如何解决它。在我的案例中,我不理解的是,为什么在执行的那个一刻,在我的案例中,这个特定的对象会发生这样的事情。我不是NoraUI框架的专家。当我查看现有的数据提供程序时,它们从不操作indexData对象,所以我也不这么做。我不知道它们是如何处理的以及何时初始化的。这就是为什么我要问这样一个问题:为什么这一刻会发生,如果我忘记了一些事情给更有经验的人。对不起,如果不清楚的话。这是一个与NoraUI框架有关的问题,而不是一个纯Java的问题。

    scenarioInitiator的执行与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)
    

    通过对调试的进一步研究,似乎引发异常的确切原因是 对象:

    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;
            }
        }
    

    我想这和

    自定义数据提供程序:

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

    所以我的问题是:

    1 回复  |  直到 7 年前
        1
  •  2
  •   Nicolas HALLOUIN    7 年前

    您的问题似乎是由这部分代码引起的:

    getIndexData(Context.getCurrentScenarioData()) 
    

    如果您创建了DataInputProvider,那么应该从 CommonDataProvider getModel()

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

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

    事实上,这两种方法在 Context 类初始化用于写入结果的场景数据索引。

    推荐文章