0

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

由于生成器代码不知道生成的类,我使用反射来触发生成类的方法,效果很好。这些方法也可能会失败,因为我使用反射通过检查对象的状态来确保方法完成了预期的工作。

我的问题是我不想在每次运行测试时都记录生成的代码。但是如果测试失败,我想查看生成的代码。有很多测试,因为我使用了 infintest,我的 eclipse 变得更慢,因为infinitest 不断积累各种测试的输出。

我可以设置 junit 以便在测试失败时调用我的函数吗?例如

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

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

4

1 回答 1

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());
  }
}

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

于 2013-02-13T06:35:11.133 回答