5

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...か?

4

4 に答える 4

4

Junit 4.7 で導入されたルールを確認する必要があります。特にTestWatchman:

TestWatchman は、テスト アクションを変更せずに記録するルールの基本クラスです。たとえば、このクラスは、成功したテストと失敗したテストのログを保持します。

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

失敗したテストを処理できる MethodRule を定義できます (javadoc からコピー)。

   @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 の新しいバージョンで廃止され、TestWatcher に置き換えられました (ただし、機能は同じです)。

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

于 2011-03-25T16:42:16.377 に答える
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 はデリゲート メソッドの生成に役立つ場合があります。

于 2011-03-25T00:09:54.247 に答える
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));
}
于 2013-08-16T09:17:36.030 に答える