web-dev-qa-db-ja.com

Java / JUnit-AssertTrueとAssertFalse

私はJavaが初めてで、 Eclipse Total Beginner's Tutorials に従っています。これらはすべて非常に役立ちますが、レッスン12では、1つのテストケースにassertTrueを使用し、別のテストケースにassertFalseを使用します。コードは次のとおりです。

// Check the book out to p1 (Thomas)
// Check to see that the book was successfully checked out to p1 (Thomas)
assertTrue("Book did not check out correctly", ml.checkOut(b1, p1));    // If checkOut fails, display message
assertEquals("Thomas", b1.getPerson().getName());

assertFalse("Book was already checked out", ml.checkOut(b1,p2));        // If checkOut fails, display message
assertEquals("Book was already checked out", m1.checkOut(b1,p2));

これらの方法に関する優れたドキュメントを検索しましたが、何も見つかりませんでした。私の理解が正しければ、assertTrueおよびassertFalseは、2番目のパラメーターがfalseと評価されたときに文字列を表示します。もしそうなら、それらの両方を持つことのポイントは何ですか?

編集:私は私が混乱していたものを見ると思います。作者は、機能を示すためだけに両方を追加したかもしれません(結局ISチュートリアルです)。そして、彼は失敗するものをセットアップしました。その結果、メッセージが印刷され、失敗した理由を教えてくれました。もっと理にかなって...私はそれが説明だと思うが、私にはわからない。

50
Thomas

assertTrueは、2番目のパラメーターがfalseに評価されると失敗します(つまり、値がtrueになることを保証します)。 assertFalseはその逆です。

assertTrue("This will succeed.", true);
assertTrue("This will fail!", false);

assertFalse("This will succeed.", false);
assertFalse("This will fail!", true);

他の多くのものと同様に、これらの方法に慣れる最良の方法は、単に実験することです:-)。

105
Matt Solnit

これらのような場合は常に JavaDoc を参照してください。

assertFalse

public static void assertFalse(Java.lang.String message,
                               boolean condition)

条件が偽であることをアサートします。そうでない場合は、指定されたメッセージでAssertionErrorをスローします。

パラメータ:

  • message-AssertionErrorの識別メッセージ(null OK)
  • condition-チェックする条件
29
user177800

私はそれがあなたの便宜のためだと思う(そしてあなたのコードの読者)

コードと単体テストは、理想的にはこのAPIが役立つ自己文書化である必要があります。

もっと読みやすいものを考えてください:

AssertTrue(!(a > 3));

または

AssertFalse(a > 3);

テストが突然失敗したxxか月後にテストを開くと、2番目のケースで何がうまくいかなかったかを理解するのに必要な時間が大幅に短縮されます(私の意見)。同意しない場合は、すべてのケースでAssertTrueをいつでも使用できます。

9
tdobek

ポイントはセマンティクスです。 assertTrueでは、式が真であることを表明しています。そうでない場合、メッセージが表示され、アサーションは失敗します。 assertFalseでは、式がfalseと評価されることをアサートしています。そうでない場合、メッセージが表示され、アサーションは失敗します。

assertTrue (message, value == false) == assertFalse (message, value);

これらは機能的には同じですが、値がfalseになることを期待している場合は、assertFalseを使用します。値がtrueになることを期待している場合は、assertTrueを使用します。

9
Xetius

これらの方法に対するあなたの最初の反応は私にとって非常に興味深いものです。私はassertTrueとassertFalseの両方が最も友好的なツールではないという将来の議論でそれを使用します。使用する場合

assertThat(thisOrThat, is(false));

それははるかに読みやすく、より良いエラーメッセージも出力します。

7
iwein

コースには論理エラーが含まれています。

    assertTrue("Book check in failed", ml.checkIn(b1));

    assertFalse("Book was aleready checked in", ml.checkIn(b1));

最初のアサートでは、checkInがTrueを返すことを期待しています(チェックインが成功したため)。これが失敗する場合、「book check in failed.bookが最初の行で既にチェックインされているため、2番目のアサートでcheckInが失敗することを期待します。したがって、checkInがFalseを返すことが予想されます。何らかの理由でチェックインがTrueを返す場合(予期しない)、チェックインが成功したため、メッセージは「Book was already in in checked」になることはありません。

2
Ronald Mos

チェックされた値がfalseの場合、assertTrueは失敗し、assertFalseは反対のことを行います。チェックされた値がtrueの場合、失敗します。

もう1つは、最後のassertEqualsが失敗する可能性が非常に高いことです。「Book was already check out」文字列をm1.checkOut(b1、p2)の出力と比較するためです。 3番目のパラメーター(等しいかどうかを確認する2番目の値)が必要です。

2
bashflyng