获取JUnit 4中当前正在执行的测试的名称

问题

在JUnit 3中,我可以得到当前运行的测试的名称,如下所示:

public class MyTest extends TestCase
{
    public void testSomething()
    {
        System.out.println("Current test is " + getName());
        ...
    }
}

这将打印"当前测试是testSomething"。

在JUnit 4中是否有任何开箱即用或简单的方法?

背景:显然,我不想只打印测试的名称。我想加载存储在与测试同名的资源中的特定于测试的数据。你知道,convention over configuration等等。

谢谢!


#1 热门回答(326 赞)

JUnit 4.7添加了这个功能,似乎使用了TestName-Rule。看起来这会得到方法名称:

import org.junit.Rule;

public class NameRuleTest {
    @Rule public TestName name = new TestName();

    @Test public void testA() {
        assertEquals("testA", name.getMethodName());
    }

    @Test public void testB() {
        assertEquals("testB", name.getMethodName());
    }
}

#2 热门回答(97 赞)

#JUnit 4.9.x及更高版本

从JUnit 4.9开始,不推荐使用TestWatchmanclass来支持TestWatcherclass,它有调用:

@Rule
public TestRule watcher = new TestWatcher() {
   protected void starting(Description description) {
      System.out.println("Starting test: " + description.getMethodName());
   }
};

#JUnit 4.7.x - 4.8.x.

以下方法将打印类中所有测试的方法名称:

@Rule
public MethodRule watchman = new TestWatchman() {
   public void starting(FrameworkMethod method) {
      System.out.println("Starting test: " + method.getName());
   }
};

#3 热门回答(7 赞)

考虑使用SLF4J(Simple Logging Facade for Java)使用参数化消息提供了一些巧妙的改进。将SLF4J与JUnit 4规则实现相结合可以提供更有效的测试类日志记录技术。

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.junit.rules.TestWatchman;
import org.junit.runners.model.FrameworkMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingTest {

  @Rule public MethodRule watchman = new TestWatchman() {
    public void starting(FrameworkMethod method) {
      logger.info("{} being run...", method.getName());
    }
  };

  final Logger logger =
    LoggerFactory.getLogger(LoggingTest.class);

  @Test
  public void testA() {

  }

  @Test
  public void testB() {

  }
}