我想做的是在 JUnit 中如下所示:
assertTrue(logger.error("the condition is not true"), <a boolean condition>);
因此错误消息被记录器记录下来,其中记录器可以是例如 commons 或 log4j。
但是 Junit 断言不采用记录器参数,所以有什么方法可以实现这一点,还是我需要尝试捕获断言并将错误消息记录在 catch 块中?
您可以使用 JUnit TestRule TestWatcher。ATestRule
在测试方法之前和之后执行代码(类似于@Before
and @After
),但您可以访问更多信息,更重要的是,测试结果。TestWatcher定义了、和等succeeded()
方法,您可以实现这些方法来获取事件通知。failed()
starting()
finished()
下面的示例简单地打印出带有失败断言的失败测试。
public class TestWatcherTest {
@Rule
public TestWatcher testWatcher = new TestWatcher() {
protected void failed(Throwable e, Description description) {
System.out.println("" + description.getDisplayName() + " failed " + e.getMessage());
super.failed(e, description);
}
};
@Test
public void test1() {
Assert.assertEquals("hello world", 3, 4);
}
}
您显然可以做您喜欢的事情,而不是 System.out.println()。这产生作为输出:
test1(uk.co.farwell.junit.TestWatcherTest) failed hello world expected:<3> but was:<4>
请注意,失败的断言是一个异常,因此您可以访问堆栈跟踪等。
我不会更改或扩展 JUnit 类。
您尝试/捕获并记录错误的安排会更可取。
问题是断言失败不一定是例外。
感觉就像您正在尝试使 log4j 成为已经存在的报告功能。我建议您查看 Ant JUnit 报告任务 - 它会为您提供一个比日志更有用的漂亮报告。
更新:
您始终可以添加另一个 log4j 文件附加程序。让 log4j 将消息写入控制台和您选择的文件。如果我是正确的,你的代码根本没有变化。
那最好用这个
if(!<condition>) {
logger.error("my message");
Assert.fail();
}