2013-02-13 37 views
0

我正在使用Java中提供的CodeModel来处理复杂的代码生成。我设法以这种方式设置我的单元测试,以便测试生成小而功能完整的Java代码,该代码在内存中编译并生成类从内存加载。如果我不输出生成的代码,一般情况下都是相当快的。断言失败时触发函数

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

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

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

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

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

回答

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

您的测试必须使用这个规则和生成的代码登录到记录仪。

+0

完美。像魅力一样工作。谢谢。 – user937720 2013-02-13 17:40:40