5

私のアプリケーションにはいくつかの実行モードがあり、そのうちの 1 つのモードでは、一部のテストで具体的な例外がスローされるのが普通です。例外がスローされた場合にメソッドをスキップするように設定する @SkipOnFail のようなもので、このメソッドに注釈を付ける必要があります。

前もって感謝します!

@Edit(私の質問をより明確にするため)

@Test(expected=ConcreteException.class)

ConcreteException.class がスローされなかった場合でもテストに合格する必要があるため (この例外がスローされない場合、junit の予期されるタグはテストを失敗としてマークします)、それ以外の場合はスキップする必要があるため、私にとっては機能しません。他のすべての場合では、いつものように動作するはずです。

私のために働いた@Solution(junit v4.7)thxから@axtavt

@Rule
public MethodRule skipRule = new MethodRule() {
    public Statement apply(final Statement base, FrameworkMethod method, Object target) {
        if(method.getAnnotation(SkipOnFail.class) == null) return base;

        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                try{
                    base.evaluate();
                } catch (ConcreteException e) {
                    Assume.assumeTrue(false);
                }
            }
        };
    }
};

@どうも

4

4 に答える 4

6

このような機能がすぐに利用できるとは思いませんが、カスタムTestRuleおよびAssume、次のようなものを使用して実装するのは非常に簡単なはずです。

@Rule
public TestRule skipRule = new TestRule() {
    public Statement apply(final Statement base, Description desc) {
         if (desc.getAnnotation(SkipOnFail.class) == null) return base;

         return new Statement() {
             public void evaluate() throws Throwable {
                 try {
                     base.evaluate();
                 } catch (MyExceptoion ex) {
                     Assume.assumeTrue(false);
                 }
             }
         };
    }
};
于 2012-05-29T18:16:30.493 に答える
2

JUnit 拡張機能の使用についてはどうですか?

次の例は、Tutorialからの抜粋です。

前提条件 (@Prerequisite) の追加の注釈を提供します。条件に基づいてテストを無視します。

必要なアプローチは、テストの実行中にこれを確認することです。@Prerequisite(requires="")したがって、注釈を追加するだけです。

public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable")
    @Test public void fillData() {
        // ...
    }

    public boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable;
    }
}
public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable")
    @Test public void fillData() {
        // ...
    }
    public boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable ;
    }
}

この指定されたメソッドは@Prerequisite(requires = "databaseIsAvailable")、ブール値またはブール値を返すパブリック メソッドである必要があります。

これらのメソッドがヘルパー クラスに統合される場合は、 を使用して呼び出されるクラス内の静的メソッドを指定することもできます@Prerequisite(requires = "databaseIsAvailable", callee="DBHelper")

public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable", callee="DBHelper")
    @Test public void fillData() {
        // ...
    }
}
public class DBHelper {
    public static boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable ;
    }
}
于 2012-05-29T17:45:38.063 に答える
0

JUnit に関するドキュメントを検索したところ、バージョン 4.9 からテスト ルールと呼ばれるものが導入されたようです ( TestRuleを参照)。これから始めるかもしれません。

としてマークされたExpectedExceptionクラスは、@Ruleスローされた例外をチェックするために役立つ可能性がありますが、テストに合格するために必須ではありません。

より高度な使用法については、発見したばかりなので、現時点では言えません。

于 2012-05-29T18:09:36.613 に答える