53

私は Java の初心者で、Eclipse Total Beginner's Tutorialsに従っています。それらはすべて非常に役立ちますが、レッスン 12 ではassertTrue、1 つのテスト ケースと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));

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

編集:何が私を混乱させていたのかがわかったと思います。作成者は、機能を示すためだけに両方を入れた可能性があります (結局のところ、これはチュートリアルです)。そして、彼は失敗するものをセットアップして、メッセージが出力され、失敗した理由を教えてくれました。意味が分かり始めてきた...それが説明だと思いますが、よくわかりません。

4

7 に答える 7

123

assertTrue2 番目のパラメーターが評価された場合false(つまり、値が true であることを保証します) は失敗します。 assertFalse反対を行います。

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

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

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

于 2010-07-13T20:19:09.917 に答える
30

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

assertFalse

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

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

パラメーター:

  • message- AssertionError の識別メッセージ (null OK)
  • condition- チェックする条件
于 2010-07-13T20:17:59.653 に答える
12

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

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

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

于 2010-07-13T20:22:35.767 に答える
9

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

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

より読みやすいものを考えてみてください。

AssertTrue(!(a > 3));

また

AssertFalse(a > 3);

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

于 2010-07-13T20:26:32.133 に答える
7

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

assertThat(thisOrThat, is(false));

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

于 2010-07-14T22:22:25.653 に答える
2

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

もう1つ、最後のassertEqualsは、「本はすでにチェックアウトされています」という文字列をm1.checkOut(b1、p2)の出力と比較するため、失敗する可能性が非常に高くなります。3番目のパラメーター(等しいかどうかを確認するための2番目の値)が必要です。

于 2010-07-13T20:22:16.093 に答える
2

コースに論理エラーがあります:

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

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

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

于 2012-12-30T12:07:16.873 に答える