0

私はJavaで利用可能なCodeModelを使用して複雑なコード生成に取り組んでいます。テストがメモリにコンパイルされ、生成されたクラスがメモリからロードされる、小さいが機能的に完全なJavaコードを生成するように、単体テストを設定することができました。生成されたコードを出力しない場合、一般的にすべてがかなり高速です。

ジェネレーターコードは生成されたクラスを認識しないため、リフレクションを使用して、生成されたクラスでメソッドを起動します。これはうまく機能します。オブジェクトの状態をチェックすることでメソッドが期待どおりに機能することを確認するためにリフレクションを使用しているため、これらのメソッドも失敗する可能性があります。

私の問題は、テストが実行されるたびに生成されたコードをログに記録したくないということです。しかし、テストが失敗した場合に生成されたコードを確認したいと思います。多くのテストがあり、私はinfintestを使用しているため、infinitestがさまざまなテストからの出力を蓄積し続けるため、日食が遅くなります。

テストが失敗した場合に関数を呼び出すようにju​​nitを設定できますか?例えば

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 に答える