如何在JUnit 5中获取测试方法的名称?
TestInfo
的参数,JUnit会自动为该方法提供一个实例。@Test
void getTestInfo(TestInfo testInfo) { // Automatically injected
System.out.println(testInfo.getDisplayName());
System.out.println(testInfo.getTestMethod());
System.out.println(testInfo.getTestClass());
System.out.println(testInfo.getTags());
}
TestInfo
实例中获取测试方法的名称(以及更多信息)。除了已经提到的将TestInfo
注入到测试方法中之外,还可以将TestInfo
注入到使用@BeforeEach
和@AfterEach
注释的方法中,这有时可能会很有用:
@BeforeEach
void setUp(TestInfo testInfo) {
log.info(String.format("test started: %s", testInfo.getDisplayName()));
}
@AfterEach
void tearDown(TestInfo testInfo) {
log.info(String.format("test finished: %s", testInfo.getDisplayName()));
}
TestInfo
接口在设置方法中自行模拟该功能以实现。从JUnit文档中关于“构造函数和方法的依赖注入”: " TestInfo "然后可用于检索有关当前容器或测试的信息,例如显示名称、测试类、测试方法和相关标记。在此,我们利用内置解析程序将与当前容器或测试对应的TestInfo
实例作为类型为TestInfo
的参数值提供给生命周期钩子(这里使用@BeforeEach
)注释的方法。import org.junit.jupiter.api.TestInfo;
public class MyTestClass {
String displayName;
@BeforeEach
void setUp(TestInfo testInfo) {
displayName = testInfo.getDisplayName();
// ... the rest of your setup
}
}
final
,因为它是动态设置的。作为参考,以下是如何在JUnit 4中实现TestName-Rule:
public class MyTestClass {
@Rule
public final TestName name = new TestName();
}
这里已经覆盖了OP的问题,但为了完整起见,我在这里添加一个Baeldung article的链接,该文章涵盖了JUnit 5和JUnit 4中如何获取测试名称的主题,以防有人在寻找如何在JUnit 4中获取测试名称时偶然发现这个问题。
正如已经提到的那样,对于JUnit 5,可以利用TestInfo
类,在测试方法或使用@BeforeEach
注释的方法中将其实例作为参数注入。对于JUnit 4,则需要使用带有@Rule
注释的TestName
实例。此处链接的文章还涉及处理参数化测试。
@Test void test(TestInfo info) { complicatedValidation(info); }
- Michael McCallum