2011-03-24 18 views
5

JUnitのアサーションが失敗したときに私はいくつかの「自分のもの」をやりたいと思います。JUnitのアサート機能を傍受する

public class MyAssert extends org.junit.Assert { 

    // @Override 
    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     org.junit.Assert.fail(message); 
    } 
} 

もちろん、静的メソッドを上書きすることはできないため、これは機能しません。しかし、もしそうなら、assertTrue()のようなすべてのアサート関数がfail()メソッドを呼び出すので、これはうまくいくでしょう。したがって、私は簡単にすべての主張を傍受することができます。

assert...のすべての異なるフレーバーを実装せずに、ここでやりたいことを行う方法はありますか?

答えて

1

Assertのすべてのメソッドとまったく同じシグネチャを実装し、Assertメソッドに委譲するクラスを作成できます。

public class MyAssert { 
    static public void assertTrue(String message, boolean condition) { 
     Assert.assertTrue(message, condition); 
    } 

    ... 

    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     Assert.fail(message); 
    } 
} 

それでも、すべての方法を再実装するのではなく、退屈です。 IDEがデリゲートメソッドの生成を支援することができます。

3

Junit 4.7で導入されたルールを見てください。特にTestWatchman:

TestWatchmanは、テストアクションを変更せずに書き留めるルールの基本クラスです。たとえば、このクラスは、各通過のログを保存し、テストを失敗します:

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html

それはあなたが失敗テスト(のjavadocからのコピー)を扱うことができるMethodRuleを定義できます:

@Rule 
    public MethodRule watchman= new TestWatchman() { 
      @Override 
      public void failed(Throwable e, FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + e.getClass().getSimpleName() 
            + "\n"; 
      } 

      @Override 
      public void succeeded(FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + "success!\n"; 
      } 
    }; 

    @Test 
    public void fails() { 
      fail(); 
    } 

    @Test 
    public void succeeds() { 
    } 

コメントTestWatchmanあたりとしてJUnitの新しいバージョンにdepecreatedされ、TestWatcherに置き換える(ただし、機能は同じです):

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatcher.html

+2

TestWatchmanは、TestWatcherに代わって廃止されたようです。 (上のリンクが壊れている) –

0

個別のアサーションでは、AssertionErrorを捕まえることができます。これは時々機能が必要なときに便利です。

try { 
    Assert.assertEquals("size", classes.length, containerList.size()); 
} catch (AssertionError e) { 
    System.err.println("ERROR"); 
    for (AbstractContainer container : containerList) { 
     System.err.println(container.getClass()); 
    } 
    throw (new RuntimeException("Failed", e)); 
} 
関連する問題