如何访问注释值(JUnit 4 -> JUnit 5)



我正试图将一个项目从JUnit 4移植到JUnit 5。该项目包括一个自定义运行器,该运行器具有一个侦听器,用于检测测试是否具有某个注释(@GradedTest)并访问注释的键值对。例如,它将能够访问以下代码中与namepoints相关的值:

@Test
@GradedTest(name = "greet() test", points = "1")
public void defaultGreeting() {
assertEquals(GREETING, unit.greet());
}

现有的JUnit 4代码有一个扩展RunListener并覆盖testStarted()的侦听器:

@Override
public void testStarted(Description description) throws Exception {
super.testStarted(description);
this.currentGradedTestResult = null;
GradedTest gradedTestAnnotation = description.getAnnotation(GradedTest.class);
if (gradedTestAnnotation != null) {
this.currentGradedTestResult =  new GradedTestResult(
gradedTestAnnotation.name(),
gradedTestAnnotation.number(),
gradedTestAnnotation.points(),
gradedTestAnnotation.visibility()
);
}
}

注意,这使用了Description.getAnnotation()

我正在尝试切换到JUnit平台启动器API。我可以使用LauncherDiscoveryRequestBuilder来选择要运行的测试,还可以创建扩展SummaryGeneratingListener并覆盖executionStarted(TestIdentifier testIdentifier)的侦听器。但是,我看不到从TestIdentifier中获取注释及其值的方法。

什么是JUnit 5相当于Description.getAnnotation()或获得测试注释值的新方法?

我确实找到了一种获取注释的方法,但我不知道它有多健壮。这是我如何覆盖SummaryGeneratingListener.executionStarted(TestIdentifier identifier):

@Override
public void executionStarted(TestIdentifier identifier) {
super.executionStarted(identifier);
this.currentGradedTestResult = null;
// Check if this is an atomic test, not a container.
if (identifier.isTest()) {
// Check if the test's source is provided.
TestSource source = identifier.getSource().orElse(null);
// If so, and if it's a MethodSource, get and use the annotation if present.
if (source != null && source instanceof MethodSource) {
GradedTest gradedTestAnnotation = ((MethodSource) source).getJavaMethod().getAnnotation(GradedTest.class);
if (gradedTestAnnotation != null) {
this.currentGradedTestResult = new GradedTestResult(
gradedTestAnnotation.name(),
gradedTestAnnotation.number(),
gradedTestAnnotation.points(),
gradedTestAnnotation.visibility()
);
this.currentGradedTestResult.setScore(gradedTestAnnotation.points());
}
}
}
this.testOutput = new ByteArrayOutputStream();
System.setOut(new PrintStream(this.testOutput));
}

弱链路为TestIdentifier.getSource()。文档说它获取"表示的测试或容器的源代码,如果可用."它在我的测试中工作,但我不知道在什么情况下源代码是可用的。

相关内容

  • 没有找到相关文章

最新更新