Rom*_*val 19

除了关于注入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());
}
Run Code Online (Sandbox Code Playgroud)


Mah*_*zad 11

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());
}
Run Code Online (Sandbox Code Playgroud)

您可以从TestInfo实例中获取测试方法名称(以及更多),如上所示。

  • 这很可爱,但是如果您有稍微复杂的测试,那么您必须在方法更改周围传递测试信息,这会使它们变得不必要的复杂。``` @Test void test(TestInfo info) { 复杂验证(info); } ``` (5认同)

zr0*_*ty7 7

在 JUnit 4 中,让测试名称全局可用的另一种方法是使用接口在设置方法中自行填充功能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
  }
}
Run Code Online (Sandbox Code Playgroud)

例如,这使您能够在其他非测试方法(例如各种实用程序方法)中引用当前测试名称,而不必将测试名称作为参数包含到从初始测试方法到该实用程序方法的每个函数调用中。

您可以对有关当前容器或测试的其他信息执行相同的操作。

似乎唯一的缺点是:

  • 无法创建实例变量final,因为它是动态设置的
  • 可能会污染您的设置代码

作为参考,以下是TestName-Rule在 JUnit 4 中的实现方式:

public class MyTestClass {
  @Rule
  public final TestName name = new TestName();
}
Run Code Online (Sandbox Code Playgroud)