我正试图将一个项目从JUnit 4移植到JUnit 5。该项目包括一个自定义运行器,该运行器具有一个侦听器,用于检测测试是否具有某个注释(@GradedTest
)并访问注释的键值对。例如,它将能够访问以下代码中与name
和points
相关的值:
@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()
。文档说它获取"表示的测试或容器的源代码,如果可用."它在我的测试中工作,但我不知道在什么情况下源代码是可用的。