我想要做的就是像下面JUnit中:的Java:在JUnit的断言使用记录器*
assertTrue(logger.error("the condition is not true"), <a boolean condition>);
所以错误消息被通过记录,其中记录器可以记录例如commons或log4j。
但Junit断言不采取记录器参数,所以有什么办法来实现这一点,或者我需要尝试捕捉断言并将错误消息记录在catch块?
我想要做的就是像下面JUnit中:的Java:在JUnit的断言使用记录器*
assertTrue(logger.error("the condition is not true"), <a boolean condition>);
所以错误消息被通过记录,其中记录器可以记录例如commons或log4j。
但Junit断言不采取记录器参数,所以有什么办法来实现这一点,或者我需要尝试捕捉断言并将错误消息记录在catch块?
您可以使用一个JUnit TestRuleTestWatcher。 A TestRule
在测试方法之前和之后执行代码(类似于@Before
和@After
),但您可以访问更多信息,更重要的是测试结果。 A 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类。
安排您尝试/捕获和记录错误将是可取的。
问题是,失败的Assert不一定是一个例外。
感觉就像你正在努力使log4j进入已经存在的报告功能。我建议你看看Ant JUnit的报告任务 - 它会给你一个好看的报告,比日志更有用。
更新:
您可以随时添加另一个log4j文件appender。让log4j将消息写入控制台和您选择的文件。如果我是正确的,那么你的代码根本没有变化。
好,我想要做的是控制输出的JUnit的断言如此我可以发送它到一些数据库进行进一步分析。有没有办法使用Ant JUnit进行报告? – shrini1000
@duffymo失败(junit)断言*是一个异常,特别是一个AssertionError。这是JUnit的工作原理。 –
当我编写JUnit时,我从来没有发现错误。我要么代码为断言取得成功,或者在那些我期望出现异常的情况下,我添加注释来说明。你可能是对的,JUnit正在以这种方式工作,但我不想对它进行编码。 – duffymo
更好地利用这则
if(!<condition>) {
logger.error("my message");
Assert.fail();
}
正是我想要的。谢谢! – shrini1000
哪个版本的JUnit引入了这个? – duffymo
@duffymo TestWatcher是在4.9中引入的,它是作为TestWatchman的替代品推出的,它本身在4.7中引入。 TestWatchman是一个稍微不同的东西,它使用了MethodRule,现在已经废弃了。 –