7

しばらくの間UnitTestを適用していますが、今日は非常に奇妙なことに遭遇しました。次のコードを検討します。

TestObject alo = null;
assert alo != null; // Pass!!!
Assert.assertNotNull(alo); // Fail, as expected.

グーグルで調べたところ、assertはjava-built-inであり、assertNotNullはJUnitでサポートされていることがわかりました。しかし、なぜassertがnullオブジェクトについて何も文句を言わないのか理解できませんか?

4

3 に答える 3

10

Hoang さん、Java 言語のアサートと JUnit のアサートの間で少し混乱していると思います。

  • Javaのassertキーワードは 1.4 で追加されたもので、クラスの内部整合性を検証できるようにすることを目的としています。ベスト プラクティスの推奨事項は、プライベート メソッドでそれらを使用して、プログラムの不変条件をテストすることでした。アサートが失敗すると、java.lang.AssertionError がスローされますが、通常はキャッチされることを意図していません。アイデアは、デバッグ中に有効にし、製品コード (デフォルト) で無効にすることができるというものでしたが、率直に言って、実際に普及したとは思いません。あまり使っているのを見たことがありません。

  • JUnit には、org.junit.Assertパッケージのさまざまな静的メソッドの形式でアサートもあります。これらは、特定のテストの結果を検証することを目的としています。これらのアサートも java.lang.AssertionError をスローしますが、JUnit フレームワークは、これらのエラーをキャッチして記録し、テスト実行の最後にすべての失敗のレポートを生成するように設定されています。これは、アサートのより一般的な使用法である IMO です。

もちろんどちらも使用できますが、JUnit アサーションははるかに表現力に富んでおり、それらを有効または無効にすることを心配する必要はありません。一方、これらは実際にはビジネス コードで使用するためのものではありません。

編集:これは動作するコード例です:

import org.junit.Assert;
import org.junit.Test;

public class MyTest {
  @Test
  public void test() {
    Object alo = null;
    assert alo != null         // Line 9
    Assert.assertNotNull(alo); // Line 10
  }
}

以下は、Java アサーションを無効 (デフォルト) にして実行した場合の出力です。

c:\workspace\test>java -cp bin;lib\junit-4.8.1.jar org.junit.runner.JUnitCore MyTest
JUnit version 4.8.1
.E
Time: 0.064
There was 1 failure:
1) test(MyTest)
java.lang.AssertionError:
  at org.junit.Assert.fail(Assert.java:91)
  ...
  at MyTest.test(MyTest.java:10)
  ...

以下は、Java アサーションを有効にして実行した場合 (-ea) です。

c:\workspace\test>java -ea -cp bin;lib\junit-4.8.1.jar org.junit.runner.JUnitCore MyTest
JUnit version 4.8.1
.E
Time: 0.064
There was 1 failure:
1) test(MyTest)
java.lang.AssertionError:
  at MyTest.test(MyTest.java:9)
  ...

最初の例では Java アサートが成功し、2 番目の例では失敗していることに注意してください。

于 2012-04-06T06:08:44.130 に答える
1

そのバグ

日食内のバグです。

于 2016-09-09T19:23:40.033 に答える