1

私は最近、 のソース コードを掘り下げています。JUnit-4.11混乱しているのは、一見冗長なProtectableインターフェイスです。宣言は次のとおりです。

public interface Protectable {
    public abstract void protect() throws Throwable;
}

TestResultクラスには、次のように匿名インスタンスを実現するメソッドvoid run(final TestCase test)Protectableあります。

protected void run(final TestCase test) {
    startTest(test);
    Protectable p = new Protectable() {
        public void protect() throws Throwable {
           test.runBare();
        }
    };
    runProtected(test, p);

    endTest(test);
}

runProtected方法は次のとおりです。

public void runProtected(final Test test, Protectable p) {
    try {
        p.protect();
    } catch (AssertionFailedError e) {
       addFailure(test, e);
    } catch (ThreadDeath e) { // don't catch ThreadDeath by accident
        throw e;
    } catch (Throwable e) {
        addError(test, e);
    }
}

runProtectedおわかりのように、を実行するだけでは何test.runBare();をするのでしょうか。以下のようなコードを書くことができないのはなぜですか。

protected void run(final TestCase test) {
    startTest(test);
    test.runBare();
    endTest(test);
}
4

3 に答える 3

2

最初に最後の質問に答えるには、使用できません

protected void run(final TestCase test) {
    startTest(test);
    test.runBare();
    endTest(test);
}

それはあなたが望むことをしないからです。JUnit は、例外を使用してアサートを管理します。具体的にはAssertionFailedError. そのため、2 つの値が等しくない場合にをAssert.assertEquals()スローします。AssertionFailedErrorしたがって、上記のメソッドでendTest(test)は、アサーション エラーが発生した場合は呼び出されません。つまり、正しいイベント (テストの失敗/エラー) が発生せtearDown()ず、実行されません。

インターフェイスは、ランナーにより一般的なインターフェイスを提供するために存在するため、さまざまなアクションを許可するためにメソッドにProtectableを渡す必要はありません。TestCase

余談ですがjunit.framework.*、これは JUnit 3 であるパッケージの一部です。JUnit 4 はその場所にあります。詳しく知りたい場合は、org.junit.*パッケージを調べてください。

于 2013-02-23T16:27:14.773 に答える
0

スローされた例外を特定の方法で処理しているようです:addFailureアサーション例外の呼び出し(テストが失敗しました)、addError他の例外の呼び出し(テストが適切にコーディングされていません)

于 2013-02-22T15:10:00.003 に答える