如何在运行时在JUnit 4中获取测试用例名称?

我想在执行JUnit测试时做一些日志记录。 在JUnit 3.x中,无论实例化测试用例如何,总是很容易获得当前运行的测试用例的名称:

public void testFoo() throws Exception() { String testName = this.getName(); // [...] do some stuff } 

在JUnit 4中,事情似乎并不那么容易。 有谁知道解决这个问题? 是否有任何选项可以反映到当前的Runner实例中?

好。 我找到了另一种方法[在互联网上的某个地方]( http://www.nabble.com/What-happened-to-getName () –td23456371.html) :

  @RunWith(Interceptors.class) public class NameTest { @Interceptor public TestName name = new TestName(); @Test public void funnyName() { assertEquals("funnyName", name.getMethodName()); } } 

在JUnit 4.7中,您还可以获取当前执行的最新方法的名称。 记录时可能会很好。

摘自JUnit 4.7发行说明( 在github上阅读):

 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()); } } 
 public class FooTest { @Rule final public TestRule traceTestWatcher = new TestWatcher() { @Override protected void starting(Description d) { System.out.println(d); } }; @Test public void testBar() { ... } @Test public void testBaz() { ... } } 

出了什么问题:

 @Test public void foo() throws Exception() { String testName = this.getName(); // [...] do some stuff } 

我知道这是旧的,但这是一个有用的(非junit)方法,我放在我的所有测试的顶部。

 public static void printTestName(){ final StackTraceElement[] ste = new Throwable().getStackTrace(); int buffer = 35 - ste[1].getMethodName().length(); System.out.println("*******************************************************"); System.out.println("* TEST: " + ste[1].getMethodName() + getBuffer(buffer) + "*"); System.out.println("*******************************************************"); } private static String getBuffer(int offset){ StringBuilder buffer = new StringBuilder(""); for(int i = 1; i < offset; i++){ buffer.append(" "); } return buffer.toString(); }