当JUnit测试抛出时,我应该如何捕获对象状态?

时间:2011-09-13 21:36:24

标签: unit-testing logging junit

我在JUnit中设置了一个简单的测试,沿着

public void testGetBar() throws MyException{
  Foo f = new Foo();
  f.setup();

  assertEquals(new Bar("1234"), f.getBar());
}

假设getBar()抛出一个MyException:JUnit将此视为“错误”的测试,我注意到我搞砸了这个方法。是的,单元测试工作!但是,我无法知道我的Foo对象出了什么问题,当我尝试getBar()时,它会抛出它,而不会返回,例如通过调试器运行测试,或添加日志记录语句。每个人都说在JUnit测试中捕获异常是一个坏主意,所以看起来很容易做到这一点:

try{
  assertEquals(new Bar("1234"), f.getBar());
} catch(MyException e) {
  log.error(f.toString());
  throw e;
}

但这是我能想到的全部。有没有JUnit-y简写说“当这个测试中有异常时,注销这个,那个,以及另一个对象状态(某种程度上)”,以便很容易找出出错的地方?

2 个答案:

答案 0 :(得分:3)

您应该提高您抛出的异常中的信息质量,以便您可以了解单元测试中出现的问题。这确保了以后如果在生产中抛出异常,您将获得有用的异常消息,而不是一些神秘的消息。

我不确定您为什么要有条件地记录异常。 单元测试应始终通过或始终抛出异常。如果您希望预期Exception,请添加注释@Test(expection=Exception.class)

如果您真的想记录异常,最优雅的方法是使用@RunWith(MyRunner.class)注释您的测试类,并创建一个处理日志记录的类MyRunner extends BlockJUnit4Runner

答案 1 :(得分:0)

您不会将所有单元测试代码包装在异常处理程序中:只是您遇到问题的代码。让JUnit捕获意外的异常,因为错误也很好:在发生这种情况时将有问题的代码包装在处理程序中并且您正在调查问题(然后再次删除)。

这应该都是非常罕见的:你不希望代码在你进行单元测试时抛出随机异常(这应该尽可能干净和可重复)。

当然,您也希望对异常生成进行单元测试:在这种情况下,您肯定希望在处理程序中包含对违规函数的调用,如果没有发生异常,则抛出fail()。 / p>