Java / JUnit - AssertTrue与AssertFalse

时间:2010-07-13 20:14:31

标签: java junit assert junit4 assertions

我是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在第二个参数求值为false时显示字符串。如果是这样的话,同时拥有它们有什么意义呢?

编辑:我想我看到令我困惑的是什么。作者可能只是为了展示他们的功能而放置它们(毕竟它是一个教程)。然后他设置了一个会失败的信息,这样就会打印出来并告诉我为什么失败了。开始变得更有意义......我认为这是解释,但我不确定。

7 个答案:

答案 0 :(得分:104)

如果第二个参数的计算结果为assertTrue,则

false将失败(换句话说,它确保该值为true)。 assertFalse反其道而行之。

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

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

与许多其他事情一样,熟悉这些方法的最佳方法是尝试: - )。

答案 1 :(得分:29)

您的理解不正确,在这种情况下,请务必咨询JavaDoc

  

<强> assertFalse

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

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

     

<强>参数:

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

答案 2 :(得分:9)

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

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

这些功能相同,但如果您希望某个值 false ,请使用assertFalse。如果您希望某个值 true ,请使用assertTrue

答案 3 :(得分:9)

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

您的代码和单元测试应该理想地自我记录此API有助于实现,

请仔细阅读更清楚的内容:

AssertTrue(!(a > 3));

AssertFalse(a > 3);

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

答案 4 :(得分:7)

您对这些方法的第一反应对我来说非常有趣。我将在将来的参数中使用它,assertTrue和assertFalse都不是最友好的工具。如果你愿意的话

assertThat(thisOrThat, is(false));

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

答案 5 :(得分:2)

如果选中的值为false,

assertTrue将失败,assertFalse将执行相反的操作:如果选中的值为true,则失败。

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

答案 6 :(得分:2)

课程包含逻辑错误:

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

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

在第一个断言中,我们希望checkIn返回True(因为checkin是成功的)。如果这会失败,我们会打印一条消息,例如&#34;预订登记失败。 现在在第二个断言中,我们期望checkIn失败,因为该书已在第一行中签入。所以我们希望checkIn返回一个False。如果出于某种原因,checkin会返回一个True(我们不会期望),而不是消息永远不会是#34; Book已经签入&#34;,因为签入成功。