我正在使用Java中提供的CodeModel进行复杂的代码生成。我已经设法以这样的方式设置我的单元测试,以便测试生成小但功能完整的Java代码,该代码在内存中编译并且生成的类从内存加载。如果我不输出生成的代码,一般来说一切都相当快。
由于生成器代码不知道生成的类,我使用反射来生成生成的类上的方法,该方法运行良好。这些方法也可能失败,因为我使用反射来确保方法通过检查对象的状态来确实工作。
我的问题是我不希望每次运行测试时都记录生成的代码。但是如果测试失败,我想看到生成的代码。有很多测试,因为我使用了infintest,我的日食变慢了,因为无限的不断累积各种测试的输出。
我可以设置junit,以便在测试失败时调用我的函数吗? e.g。
boolean compileSuccessful = compile();
Assert.assertTrue("Ooops, you generated bad code", compileSuccessful);
如果上面的断言失败,我想输出生成的代码,看看出了什么问题。
答案 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());
}
}
您的测试必须使用此规则并将生成的代码记录到记录器中。