在JUnit 3中,我可以像这样获得当前运行的测试的名称:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
它会打印“当前测试是testSomething”。
在JUnit 4中是否有任何开箱即用或简单的方法来做到这一点?
背景:显然,我不想只打印测试的名称。我希望加载存储在与测试同名的资源中的特定于测试的数据。你知道,约定比配置更重要。
在JUnit 5中,TestInfo代替了JUnit 4中的TestName规则。
从文档中可以看到:
TestInfo用于注入有关当前测试的信息
容器到@Test, @RepeatedTest, @ParameterizedTest,
@TestFactory, @BeforeEach, @AfterEach, @BeforeAll和@AfterAll
方法。
要检索当前执行测试的方法名,您有两个选项:String TestInfo.getDisplayName()和
TestInfo.getTestMethod()方法。
仅检索当前测试方法的名称TestInfo.getDisplayName()可能不够,因为测试方法的默认显示名称是methodName(TypeArg1, TypeArg2,…TypeArg3)。
在@DisplayName("..")中复制方法名并不一定是个好主意。
作为你可以使用的替代方案
返回一个Optional<Method>对象的TestInfo.getTestMethod()。
如果在测试方法中使用检索方法,则甚至不需要测试Optional包装值。
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.TestInfo;
import org.junit.jupiter.api.Test;
@Test
void doThat(TestInfo testInfo) throws Exception {
Assertions.assertEquals("doThat(TestInfo)",testInfo.getDisplayName());
Assertions.assertEquals("doThat",testInfo.getTestMethod().get().getName());
}