在 HierarchicalTestEngine 中更改容器 TestExecutionResult

问题描述

注意:如果你从未见过测试引擎,一开始你可能会很困惑(至少对我来说是这样)。有一个例子 here


junit5 中,可以创建一个自定义TestEngine 来发现和执行测试(不仅仅是标准的 @Test 注释方法)。此扩展的文档是 here,但 this post 肯定更详尽。关于这个高级主题的资源和演示很少,所以我尝试了一些实验。据我了解,基本上有两种方法

  • 同时实现 discover 接口的 executeTestEngine 方法
  • HierarchicalTestEngine 扩展并仅实现 discover 方法

我会说第二个是最干净的,即使我不确定你在执行阶段是否有同样的自由。

在第一种方法中,为测试容器设置 TestExecutionResult 非常简单

public void execute(ExecutionRequest request) {
    TestDescriptor rootDescriptor = request.getRoottestDescriptor();
    var listener = request.getEngineExecutionListener();
    ...
    listener.executionFinished(containerDescriptor,TestExecutionResult.successful());
}

在这种情况下,整个代码并不重要,containerDescriptor一个 TestDescriptor,其 getType() 返回 Type.CONTAINER。在实际代码中,我根据容器包含的测试结果设置了 TestExecutionResult


第二种方法如何设置容器的测试执行结果?毕竟实际只执行了TestDescriptorgetType() == Type.Test,所以我可以轻松操作结果(覆盖 Node.execute 方法)。我查看了 Node 界面,看看是否有一些有用的东西,但我错过了。甚至 nodeFinished 都不够,因为我只收到容器的 TestDescriptor,而不是所有孩子的测试执行结果。

目前,这是我的描述符的定义:

public class MyTestClassDescriptor extends AbstractTestDescriptor
        implements Node<MyEngineExecutionContext> {
  public MyTestClassDescriptor(Class<?> testClass,TestDescriptor parent) {
      super(...);
      ...
  }


  @Override
  public Type getType() {
    return Type.CONTAINER;
  }

}

我当然可以调整 MyEngineExecutionContext 来存储一种包含所有结果的地图,但这似乎是在重新发明轮子。

额外问题:容器的 TestExecutionResult 何时有意义?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)