我想要做的是JUnit中的以下内容:
assertTrue(logger.error("the condition is not true"), <a boolean condition>);
因此记录器会记录错误消息,其中记录器可以是例如记录器。 commons或log4j。
但是Junit声明不接受记录器参数,所以有没有办法实现这一点,或者我是否需要尝试捕获断言并在catch块中记录错误消息?
答案 0 :(得分:20)
您可以使用JUnit TestRule TestWatcher。 TestRule
在测试方法之前和之后执行代码(类似于@Before
和@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>
请注意,失败的断言是一个例外,因此您可以访问堆栈跟踪等。
答案 1 :(得分:3)
我不会改变或扩展JUnit类。
您尝试/捕获并记录错误的安排将更可取。
问题在于断言失败不一定是例外。
感觉就像是在尝试将log4j变成已经存在的报告功能。我建议您查看Ant JUnit报告任务 - 它会给你一个漂亮的报告,它比日志更有用。
更新:
您始终可以添加另一个log4j文件追加程序。让log4j将消息写入控制台和您选择的文件。如果我是正确的话,你的代码根本没有变化。
答案 2 :(得分:2)
更好地使用它
if(!<condition>) {
logger.error("my message");
Assert.fail();
}