首页 > 解决方案 > 如何在junit 5扩展中获得重复计数

问题描述

我尝试编写自己的 JUnit 5 扩展,提供一些关于测试持续时间的简单信息。我也想打印出重复信息,但是如何在扩展中访问这些信息?是否有任何简单的方法可以代替反射或将数字写入和解析为显示名称?

简单的例子:

@ExtendWith(TimingExtension.class)
public class MyTestClass {
    @RepeatedTest(value = 5, name = "{currentRepetition}/{totalRepetitions}")
    public void myTest(TestInfo testInfo, RepetitionInfo repInfo) {
        // do some work here...
    }
}


public class TimingExtension implements AfterTestExecutionCallback {
    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception {
        if(context.getRequiredTestMethod().getDeclaredAnnotation(RepeatedTest.class) != null) {
            System.out.println("This was test X of Y"); // how to get currentRepetition and totalRepetitions here?
        }
    }
}

标签: javajunit5junit5-extension-model

解决方案


不幸的是,扩展中不支持参数注入。这只是一种方式。所以为了进入RepetitionInfo你的TimingExtension你必须设置它。

首先你需要使用@RegisterExtension例如

public class MyTestClass {

    @RegisterExtension
    TimingExtension timingExt = new TimingExtension();

    @RepeatedTest(value = 5, name = "{currentRepetition}/{totalRepetitions}")
    public void myTest(TestInfo testInfo, RepetitionInfo repInfo) {
        timingExt.setRepetitionInfo(repInfo);
        // do some work here...
    }
}

public class TimingExtension implements AfterTestExecutionCallback {

    private RepetitionInfo repInfo;

    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception {
        if (context.getRequiredTestMethod().getDeclaredAnnotation(RepeatedTest.class) != null && repInfo != null) {
            System.out.println(String.format("This was test %d of %d", repInfo.getCurrentRepetition(), repInfo.getTotalRepetitions()))
            repInfo = null;
        }
    }

    public void setRepetitionInfo(RepetitionInfo repInfo) {
        this.repInfo = repInfo;

    }
}

推荐阅读