53

我对 Java 很陌生,并且正在关注Eclipse Total Beginner's Tutorials。它们都非常有帮助,但在第 12 课中,他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当第二个参数评估为假时显示字符串。如果是这样,同时拥有它们有什么意义?

编辑:我想我明白了什么让我感到困惑。作者可能将它们都放入只是为了展示它们的功能(毕竟这是一个教程)。他设置了一个会失败的设备,以便打印出消息并告诉我为什么会失败。开始变得更有意义......我认为这就是解释,但我不确定。

4

7 回答 7

123

assertTrue如果第二个参数的计算结果为false(换句话说,它确保该值为真),则将失败。 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

断言假

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

断言条件为假。如果不是,它会抛出带有给定消息的 AssertionError。

参数:

  • message- AssertionError 的识别消息(null 可以)
  • condition- 要检查的条件
于 2010-07-13T20:17:59.653 回答
12

重点是语义。在 assertTrue 中,您断言表达式为真。如果不是,那么它将显示消息并且断言​​将失败。在 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 个月后打开你的测试时,你的测试突然失败了,你会花更少的时间来理解第二种情况下出了什么问题(我的观点)。如果您不同意,您始终可以在所有情况下坚持使用 AssertTrue :)

于 2010-07-13T20:26:32.133 回答
7

你对这些方法的第一反应对我来说很有趣。我将在以后的论点中使用它,即 assertTrue 和 assertFalse 都不是最友好的工具。如果你会使用

assertThat(thisOrThat, is(false));

它更具可读性,并且也打印出更好的错误消息。

于 2010-07-14T22:22:25.653 回答
2

assertTrue如果检查值为假,assertFalse将失败,反之亦然:如果检查值为真,则失败。

另一件事,您的最后一个 assertEquals 很可能会失败,因为它会将“书已签出”字符串与 m1.checkOut(b1,p2) 的输出进行比较。它需要第三个参数(检查相等性的第二个值)。

于 2010-07-13T20:22:16.093 回答
2

该课程包含一个逻辑错误:

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

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

在第一个断言中,我们希望 checkIn 返回 True(因为 checkin 是成功的)。如果这会失败,我们将打印一条消息,如“图书签入失败。现在在第二个断言中,我们希望签入失败,因为这本书已经在第一行签入。所以我们希望签入返回 False。如果由于某种原因签入返回 True(我们不期望),那么消息永远不应是“书已签入”,因为签入是成功的。

于 2012-12-30T12:07:16.873 回答