7

私がやりたいのは、JUnitで次のようなものです。

assertTrue(logger.error("the condition is not true"), <a boolean condition>);

そのため、エラーメッセージはロガーによってログに記録されます。ロガーはcommonsやlog4jなどです。

しかし、JUnitアサーションはロガーパラメーターを受け取らないので、これを達成する方法はありますか、それともアサーションをキャッチしてエラーメッセージをcatchブロックに記録する必要がありますか?

4

3 に答える 3

22

JUnitTestRuleTestWatcher を使用できます。ATestRuleは、テストメソッドの前後にコードを実行します(@Beforeおよびと同様@After)が、より多くの情報、さらに重要なことに、テストの結果にアクセスできます。TestWatcherは、、、、などsucceeded()のメソッドを定義します。これらのメソッドを実装して、イベントの通知を受け取ることができます。failed()starting()finished()

次の例は、失敗したアサーションとともに失敗したテストを出力するだけです。

public class TestWatcherTest {
  @Rule
  public TestWatcher testWatcher = new TestWatcher() {
    protected void failed(Throwable e, Description description) {
      System.out.println("" + description.getDisplayName() + " failed " + e.getMessage());
      super.failed(e, description);
    }

  };

  @Test
  public void test1() {
    Assert.assertEquals("hello world", 3, 4);
  }
}

System.out.println()の代わりに、明らかに好きなことを行うことができます。これは出力として生成されます:

test1(uk.co.farwell.junit.TestWatcherTest) failed hello world expected:<3> but was:<4>

失敗したアサーションは例外であるため、スタックトレースなどにアクセスできることに注意してください。

于 2012-05-24T10:21:36.087 に答える
3

JUnitクラスを変更または拡張することはありません。

エラーを試行/キャッチしてログに記録する配置が望ましいでしょう。

問題は、Assertの失敗が必ずしも例外ではないということです。

log4jを既存のレポート機能にしようとしているように感じます。Ant JUnitレポートタスクを調べることをお勧めします。これにより、ログよりも便利な見栄えの良いレポートが得られます。

アップデート:

別のlog4jファイルアペンダーをいつでも追加できます。log4jに、コンソールと選択したファイルの両方にメッセージを書き込ませます。私が正しければ、コードに変更はありません。

于 2012-05-24T09:17:24.427 に答える
2

次にこれを使用する方が良い

if(!<condition>) {
logger.error("my message");
Assert.fail();
}
于 2012-05-24T09:22:44.717 に答える