7

我想做的是在 JUnit 中如下所示:

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

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

但是 Junit 断言不采用记录器参数,所以有什么方法可以实现这一点,还是我需要尝试捕获断言并将错误消息记录在 catch 块中?

4

3 回答 3

22

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

请注意,失败的断言是一个异常,因此您可以访问堆栈跟踪等。

于 2012-05-24T10:21:36.087 回答
3

我不会更改或扩展 JUnit 类。

您尝试/捕获并记录错误的安排会更可取。

问题是断言失败不一定是例外。

感觉就像您正在尝试使 log4j 成为已经存在的报告功能。我建议您查看 Ant JUnit 报告任务 - 它会为您提供一个比日志更有用的漂亮报告。

更新:

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

于 2012-05-24T09:17:24.427 回答
2

那最好用这个

if(!<condition>) {
logger.error("my message");
Assert.fail();
}
于 2012-05-24T09:22:44.717 回答