30

assertJUnit の JVM インスタンスではアサーションが有効になっていないため、JUnit テスト スイートでは失敗しなかった Java ステートメントに何度か悩まされました。明確にするために、これらは実装内の「ブラックボックス」アサーション (不変条件のチェックなど) であり、JUnit テスト自体によって定義されたアサーションではありません。もちろん、テスト スイートでそのようなアサーションの失敗をキャッチしたいと思います。

明らかな解決策は、 JUnit を実行するときは常に慎重に使用する-enableassertionsことですが、より堅牢な解決策を希望します。1 つの代替方法は、すべてのテスト クラスに次のテストを追加することです。

  @Test(expected=AssertionError.class)
  public void testAssertionsEnabled() {
    assert(false);
  }

これを達成するためのより自動的な方法はありますか?JUnit に対するシステム全体の構成オプション? メソッドに入れることができる動的呼び出しsetUp()

4

4 に答える 4

21

Eclipseでは、 WindowsPreferencesJava→に移動できます。これには、新しい起動構成が作成されるたびJUnitに追加するオプションがあります。オプションをデバッグ構成にも-ea追加します。-ea

チェックボックスの横の全文は

新しい JUnit 起動構成を作成するときに、VM 引数に「-ea」を追加します

于 2010-08-02T20:00:10.337 に答える
5

簡単なテストの後、私のために働く3つの可能な(単純な?)修正を提案します(ただし、静的初期化ブロックを使用することの副作用を確認する必要があるかもしれません)

1.) 有効化されているアサーションに依存するテストケースに static-initializer ブロックを追加します

import ....
public class TestXX....
...
    static {
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
   ...
   @Test(expected=AssertionError.class)
   ...
...

2.)アサーションを有効にする必要があるすべてのテストクラスが拡張する基本クラスを作成します

public class AssertionBaseTest {
    static {
        //static block gets inherited too
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
}

3.) すべてのテストを実行するテスト スイートを作成する

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    //list of comma-separated classes
    /*Foo.class,
    Bar.class*/
})
public class AssertionTestSuite {
    static {
        //should run before the test classes are loaded
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
    public static void main(String args[]) {
        org.junit.runner.JUnitCore.main("AssertionTestSuite");
    }
}
于 2009-11-25T16:18:21.540 に答える
4

または、アサーションをオフにできないようにコードをコンパイルすることもできます。Java 6 では、私の小さなハックである"fa.jar – Force assertion check even when not enabled"を使用できます。

于 2009-11-26T02:20:13.520 に答える
1

私の友人が言うように... アサートをオフにするつもりなら、なぜアサートを書くのに時間がかかるのでしょうか?

そのロジックを考えると、すべての assert ステートメントは次のようになります。

if(!(....))
{
    // or some other appropriate RuntimeException subclass
    throw new IllegalArgumentException("........."); 
}

おそらくあなたが望む方法であなたの質問に答えるために:-)

import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;


@RunWith(Suite.class)
@Suite.SuiteClasses({
        FooTest.class,
        BarTest.class
        })
public class TestSuite
{
    @BeforeClass
    public static void oneTimeSetUp()
    {
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
}

次に、各テストではなくテスト スイートを実行します。これは (私のテストでは機能しますが、JUnit フレームワーク コードの内部を読んでいませんでした)、テスト クラスがロードされる前にアサーション ステータスが設定されるはずです。

于 2009-11-25T17:37:16.390 に答える