1

コード全体でアサーション エラーが発生すると、テストが失敗します。

次のような JUnit ルールがあります。

public class AcmeTestRule implements TestRule {
    @Override
    public Statement apply(final Statement statement, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                ClassLoader classLoader = getClass().getClassLoader();
                classLoader.clearAssertionStatus();
                classLoader.setDefaultAssertionStatus(true);
                //classLoader.setPackageAssertionStatus("com.acme", true); // no effect

                statement.evaluate();
            }
        }
    }
}

そして、それは次のような基本テストクラスにあります:

public abstract class AcmeTestCase {
    @ClassRule
    public static final AcmeTestRule acmeTestRule = new AcmeTestRule();
}

次に、ルール自体が機能していることを確認するために、次のテストを行います。

public class TestAcmeTestRule extends AcmeTestCase4 {
    @Test
    public void testAssertions() {
        try {
            assert false;
        } catch (AssertionError) {
            // good.
            return;
        }

        fail("Didn't throw AssertionError on assert false");
    }
}

「assert false」がまだ例外をスローしなかったため、自動ビルドでのテストは失敗します。まったく同じテスト パスが IDE から実行されます。アサーションをオンにするコマンドライン フラグは設定していません (ただし、IDE が背後で実行している可能性があります)。

ちなみに、私がこれを行うと:

public class TestAcmeTestRule {
    @ClassRule
    public static final AcmeTestRule acmeTestRule = new AcmeTestRule();

    @Test
    public void testAssertions() {
        try {
            assert false;
        } catch (AssertionError) {
            // good.
            return;
        }

        fail("Didn't throw AssertionError on assert false");
    }
}

結果のテストは、IDE でも失敗するようになりました。そして、ルールを抽象クラスからテスト クラスに移動しただけです。

これは奇妙なクラスローディングの問題だと思います。私の理論: アサーション ステータスはバイトコードを読み取るときにのみ使用されるため、バイトコードを実行するまでには値を変更するには遅すぎます。

4

1 に答える 1

3

ClassLoader.setDefaultAssertionStatus(およびすべての同様のメソッド)の問題は、それらが既にロードされているクラスに影響を与えないことです。ドキュメントから

この設定は、このクラス ローダーによってロードさ 将来初期化されるクラスのアサーションをデフォルトで有効にするか無効にするかを決定します。

したがって、他のすべてのクラスがロードされる前にこれが実行されることを確認しない限り、コード内のアサーションを確実に有効にすることはできません (これはおそらくエラーが発生しやすい)。

これが IDE で機能する理由は、おそらく、IDE が適切なコマンドライン パラメータを渡すことによってアサーションを有効にする傾向があるか、またはクラスのロードの順序が異なるためです。

于 2012-11-07T06:10:19.120 に答える