2013-02-13 97 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