コード全体でアサーション エラーが発生すると、テストが失敗します。
次のような 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 でも失敗するようになりました。そして、ルールを抽象クラスからテスト クラスに移動しただけです。
これは奇妙なクラスローディングの問題だと思います。私の理論: アサーション ステータスはバイトコードを読み取るときにのみ使用されるため、バイトコードを実行するまでには値を変更するには遅すぎます。