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

时间:2009-07-01 14:31:06

标签: java reflection junit

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

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

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

5 个答案:

答案 0 :(得分:10)

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

取自JUnit 4.7发行说明(阅读here at 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());
    }
}

答案 1 :(得分:5)

行。我找到了另一种方法[在互联网上的某个地方](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()); 
            } 
    } 

答案 2 :(得分:4)

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() {
        ...
    }
}

答案 3 :(得分:0)

出了什么问题:

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

答案 4 :(得分:0)

我知道这是旧的,但这是一个有用的(非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();
}