断言失败时的触发功能

时间:2013-02-13 03:34:44

标签: java junit junit4 assert infinitest

我正在使用Java中提供的CodeModel进行复杂的代码生成。我已经设法以这样的方式设置我的单元测试,以便测试生成小但功能完整的Java代码,该代码在内存中编译并且生成的类从内存加载。如果我不输出生成的代码,一般来说一切都相当快。

由于生成器代码不知道生成的类,我使用反射来生成生成的类上的方法,该方法运行良好。这些方法也可能失败,因为我使用反射来确保方法通过检查对象的状态来确实工作。

我的问题是我不希望每次运行测试时都记录生成的代码。但是如果测试失败,我想看到生成的代码。有很多测试,因为我使用了infintest,我的日食变慢了,因为无限的不断累积各种测试的输出。

我可以设置junit,以便在测试失败时调用我的函数吗? e.g。

boolean compileSuccessful = compile();
Assert.assertTrue("Ooops, you generated bad code", compileSuccessful);

如果上面的断言失败,我想输出生成的代码,看看出了什么问题。

1 个答案:

答案 0 :(得分:1)

您可以使用TestRule,将生成的代码添加到失败测试的输出中。我建议延长TestWatcher.

public class GeneratedCodeLogger extends TestWatcher {
  private Logger log;

  public GeneratedCodeLogger(Logger log) {
    this.log = log;
  }

  @Override
  protected void failed(Description d) {
    System.out.println(log.toString());
  }
}

您的测试必须使用此规则并将生成的代码记录到记录器中。