拦截JUnit声明函数
问题描述:
当JUnit声明失败时,我想做一些“自己的东西”。我想这样:拦截JUnit声明函数
public class MyAssert extends org.junit.Assert {
// @Override
static public void fail(String message) {
System.err.println("I am intercepting here!");
org.junit.Assert.fail(message);
}
}
当然,这不起作用,因为你不能重载静态方法。但是,如果它会,这将是很好的,因为每个断言功能如assertTrue()
调用fail()
方法。因此,我可以轻松拦截每一个断言。
是否存在任何方式来做我想在这里做的事情,而不是实现所有不同口味的assert...
?
答
您可以编写一个类,它实现与Assert中所有方法完全相同的签名,然后委派给Assert方法。
public class MyAssert {
static public void assertTrue(String message, boolean condition) {
Assert.assertTrue(message, condition);
}
...
static public void fail(String message) {
System.err.println("I am intercepting here!");
Assert.fail(message);
}
}
不完全重新实现所有的方法,但繁琐的然而。您的IDE可能能够帮助生成委托方法。
答
你应该看看Junit 4.7中引入的规则。特别是TestWatchman:
TestWatchman是规则的基类,它记录了测试操作,但未对其进行修改。例如,这个类将保持一个日志中的每个通过和未通过测试的:
http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html
它可以让你定义一个MethodRule可以处理失败的测试(从javadoc中复制):
@Rule
public MethodRule watchman= new TestWatchman() {
@Override
public void failed(Throwable e, FrameworkMethod method) {
watchedLog+= method.getName() + " " + e.getClass().getSimpleName()
+ "\n";
}
@Override
public void succeeded(FrameworkMethod method) {
watchedLog+= method.getName() + " " + "success!\n";
}
};
@Test
public void fails() {
fail();
}
@Test
public void succeeds() {
}
按照评论TestWatchman在新版本的Junit中被废弃,并被TestWatcher取代(但功能相同):
http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatcher.html
答
对于个人断言,您可以捕捉AssertionError - 以下作品适合我。当你偶尔需要功能时,它很有用。
try {
Assert.assertEquals("size", classes.length, containerList.size());
} catch (AssertionError e) {
System.err.println("ERROR");
for (AbstractContainer container : containerList) {
System.err.println(container.getClass());
}
throw (new RuntimeException("Failed", e));
}
TestWatchman似乎已被弃用,以支持TestWatcher。 (上面的链接被打破) – 2013-08-16 09:13:32