Java:在JUnit中使用记录器断言*

时间:2012-05-24 09:12:54

标签: java logging junit assert

我想要做的是JUnit中的以下内容:

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

因此记录器会记录错误消息,其中记录器可以是例如记录器。 commons或log4j。

但是Junit声明不接受记录器参数,所以有没有办法实现这一点,或者我是否需要尝试捕获断言并在catch块中记录错误消息?

3 个答案:

答案 0 :(得分:20)

您可以使用JUnit TestRule TestWatcherTestRule在测试方法之前和之后执行代码(类似于@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();
}