Java / JUnit – AssertTrue vs AssertFalse

我对Java很新,并且遵循Eclipse Total Beginner的教程 。 他们都非常有帮助,但在第12课中,他使用assertTrue作为一个testing用例, 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)); 

我已经在这些方法上search了很好的文档,但没有find任何东西。 如果我的理解是正确的,当第二个参数的计算结果为false时, assertTrue以及assertFalse显示string。 如果是这样的话,那么两者有什么关系呢?

编辑:我想我看到什么让我困惑。 作者可能已经把它们都放在了显示它们的function上(毕竟它是一个教程)。 而他build立了一个会失败的东西,这样信息就会打印出来,告诉我为什么失败了。 开始更有意义…我认为这是解释,但我不确定。

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

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

和许多其他事情一样,熟悉这些方法的最好方法就是试验:-)。

你的理解是不正确的,像这样的情况下总是咨询JavaDoc 。

assertFalse

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

断言条件是错误的。 如果不是,则抛出一个带有给定消息的AssertionError。

参数:

  • message – AssertionError的标识消息(null)
  • condition – 条件进行检查

重点是语义。 在assertTrue中,你断言expression式是真的。 如果不是,则会显示消息,断言将失败。 在assertFalse中,您断言expression式的计算结果为false。 如果不是,则显示该消息,断言失败。

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

这些在function上是相同的,但是如果您希望值为false,则使用assertFalse 。 如果您期望值为true ,则使用assertTrue

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

你的代码和你的unit testing应该是自我logging这个API的帮助,

想一想更清楚的是:

 AssertTrue(!(a > 3)); 

要么

 AssertFalse(a > 3); 

当你在xx个月后打开你的testing,当你的testing突然失败的时候,你将会花费更less的时间去理解第二种情况(我的观点)出了什么问题。 如果你不同意,你可以随时坚持使用AssertTrue)

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

 assertThat(thisOrThat, is(false)); 

它更可读,它也打印出更好的错误信息。

如果选中的值为false, assertTrue将失败,并且assertFalse将做相反的操作:如果选中的值为true,则失败。

另一件事,你的最后一个assertEquals很可能会失败,因为它会将“Book has been checked out”string与m1.checkOut(b1,p2)的输出进行比较。 它需要第三个参数(第二个值来检查是否相等)。

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

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

在第一个断言中,我们期望checkIn返回True(因为checkin是成功的)。 如果这样做会失败,我们会打印一条消息,比如“book check in failed”,现在在第二个断言中,我们期望checkIn失败,因为这本书已经在第一行了,所以我们期望checkIn返回一个False。如果由于某种原因checkin返回一个True(我们不期望),而不应该是“Book已经签入”,因为签入是成功的。