【问题标题】:Java/ JUnit - AssertTrue vs AssertFalseJava/ JUnit - AssertTrue 与 AssertFalse
【发布时间】:2023-03-24 19:15:01
【问题描述】:

我对 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));

我已经搜索了有关这些方法的良好文档,但没有找到任何东西。如果我的理解是正确的,assertTrueassertFalse 在第二个参数评估为 false 时显示字符串。如果是这样,同时拥有它们有什么意义?

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

【问题讨论】:

  • 哇...我刚刚意识到,如果我将鼠标悬停在 Eclipse 中的一个方法上,它会给我有关它的信息。谢谢大家的回答!
  • 学习 AssertJ -> assertj.org

标签: java junit assert junit4 assertions


【解决方案1】:

如果第二个参数的计算结果为falseassertTrue 将失败(换句话说,它确保该值为 true)。 assertFalse 则相反。

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

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

与许多其他事情一样,熟悉这些方法的最佳方法就是进行实验 :-)。

【讨论】:

  • assert 可以解释为must be。因此,您可以将语句assertTrue("~", expression); 解释为表达式必须为真。
  • 实际上最好的方法是阅读javadoc比实验猜测总是更好。
【解决方案2】:

您的理解有误,遇到此类情况请咨询JavaDoc

assertFalse

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

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

参数:

  • message - AssertionError 的识别消息(null OK)
  • condition - 要检查的条件

【讨论】:

    【解决方案3】:

    重点是语义。在 assertTrue 中,您断言表达式为真。如果不是,那么它将显示消息并且断言​​将失败。在 assertFalse 中,您断言表达式的计算结果为 false。如果不是,则显示消息并且断言​​失败。

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

    它们在功能上是相同的,但如果您期望值是 false,请使用 assertFalse。如果您期望值是 true,请使用 assertTrue

    【讨论】:

    • 谢谢。我想我明白了。在assertFalse中,应该说“value==true”吗?
    【解决方案4】:

    我认为这只是为了您(以及您代码的读者)的方便

    您的代码和单元测试应该是理想的自我记录,此 API 可提供帮助,

    想想什么更清晰易读:

    AssertTrue(!(a > 3));
    

    AssertFalse(a > 3);
    

    当你在 xx 个月后打开你的测试时,你的测试突然失败了,你会花更少的时间来理解第二种情况出了什么问题(我的观点)。如果您不同意,您始终可以在所有情况下坚持使用 AssertTrue :)

    【讨论】:

      【解决方案5】:

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

      assertThat(thisOrThat, is(false));
      

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

      【讨论】:

      • 感谢您的建议!不过,我只是在学习教程。
      【解决方案6】:

      如果检查值为假,assertTrue 将失败,而assertFalse 则相反:如果检查值为真,则失败。

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

      【讨论】:

      • 谢谢!我偶然输入了最后一个 assertEquals 语句。不应该在那里
      【解决方案7】:

      课程包含逻辑错误:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 2019-02-02
        相关资源
        最近更新 更多