JUnit getMethodName returns 空

JUnit getMethodName returns null

我正在 运行 进行一些 Selenium 测试,但我无法访问我的测试方法的名称。 我想在日志中打印一些东西,比如 "Starting test: foobarbaz"

我所有的测试class都继承了一个public"AbstractTest"class,其中包含:

@Rule TestName name = new TestName();

@BeforeTest
public void testSetUp(){
    System.out.println(name);
    System.out.println(name.getMethodName());
}

但输出是:

org.junit.rules.TestName@59f63e24
null

为什么 getMethodName() 方法返回 null?

我的 pom.xml 摘录可能有用...

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>

如评论中所述,该问题混合了 JUnit 4、JUnit Jupiter (JUnit 5) 和 TestNG,您可能只想关注一个问题。

在 JUnit Jupiter 中,可以通过 ExtensionContext 访问此信息。我不知道有什么内置扩展可以打印它,但是自己写一个很容易:

public class NamePrinter implements BeforeEachCallback {
    @Override
    public void beforeEach(ExtensionContext extensionContext) throws Exception {
        extensionContext.getTestMethod().ifPresent(m -> System.out.println(
                "Running method: " + m.getName() + 
                " [display name: " + extensionContext.getDisplayName() + ")"));
    }
}

然后您就可以将其用作扩展:

@ExtendWith(NamePrinter.class)
public class MyClassTest {

    @Test
    public void someTest() {
        System.out.println("This is a test");
    }
}

TestNG 解决方案有效(在另一个线程中找到):

import java.lang.reflect.Method;

public class Test {

    @BeforeMethod
    public void handleTestMethodName(Method method){
        String testName = method.getName(); 
    }

}