2012-05-24 36 views
4

我想要做的就是像下面JUnit中:的Java:在JUnit的断言使用记录器*

assertTrue(logger.error("the condition is not true"), <a boolean condition>); 

所以错误消息被通过记录,其中记录器可以记录例如commons或log4j。

但Junit断言不采取记录器参数,所以有什么办法来实现这一点,或者我需要尝试捕捉断言并将错误消息记录在catch块?

回答

19

您可以使用一个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> 

需要注意的是一个失败的断言是个例外,所以你必须访问堆栈跟踪等

+0

正是我想要的。谢谢! – shrini1000

+0

哪个版本的JUnit引入了这个? – duffymo

+2

@duffymo TestWatcher是在4.9中引入的,它是作为TestWatchman的替代品推出的,它本身在4.7中引入。 TestWatchman是一个稍微不同的东西,它使用了MethodRule,现在已经废弃了。 –

3

我不会改变或扩展JUnit类。

安排您尝试/捕获和记录错误将是可取的。

问题是,失败的Assert不一定是一个例外。

感觉就像你正在努力使log4j进入已经存在的报告功能。我建议你看看Ant JUnit的报告任务 - 它会给你一个好看的报告,比日志更有用。

更新:

您可以随时添加另一个log4j文件appender。让log4j将消息写入控制台和您选择的文件。如果我是正确的,那么你的代码根本没有变化。

+0

好,我想要做的是控制输出的JUnit的断言如此我可以发送它到一些数据库进行进一步分析。有没有办法使用Ant JUnit进行报告? – shrini1000

+0

@duffymo失败(junit)断言*是一个异常,特别是一个AssertionError。这是JUnit的工作原理。 –

+0

当我编写JUnit时,我从来没有发现错误。我要么代码为断言取得成功,或者在那些我期望出现异常的情况下,我添加注释来说明。你可能是对的,JUnit正在以这种方式工作,但我不想对它进行编码。 – duffymo

2

更好地利用这则

if(!<condition>) { 
logger.error("my message"); 
Assert.fail(); 
}