问题
在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开始,不推荐使用TestWatchman
class来支持TestWatcher
class,它有调用:
@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() {
}
}