断言中没有例外?

时间:2014-09-06 12:57:05

标签: java junit

我在JUnit测试中遇到了一些断言的奇怪行为 这让我很困惑。

@Test
public void ArticleTest()
{
   Article ArticeToTest = null;

   assert(ArticeToTest.get_price() == price); //No exception here!?
   boolean test = ArticeToTest.get_price() == price; //NullPointerException!
}

我真的不明白为什么断言没有引起任何异常。 我甚至可以在调试模式下运行这一行而没有任何错误, 该异常仅发生在最后一行。如果我删除最后一行,则测试显示为绿色!?

我正在使用Eclipse Luna(4.4.0),javac 1.8.0_20和JUnit 4.11。

4 个答案:

答案 0 :(得分:3)

只有在使用-ea(启用断言)运行JVM时,Java断言才有效。

你确定你用-ea运行它吗?

您可以在Eclipse运行配置中进行检查。

答案 1 :(得分:3)

关键字assert不是用于在测试期间进行验证,而是用于建立在运行时检查的不变量,如果您明确告诉java检查它们(使用-ea-enableassertions) ,另见Programming With Assertions。请注意,这在测试期间非常有用,但它与单元测试不同。如果禁用断言(默认值),则整个语句忽略

但是,在进行单元测试时,您需要使用测试框架的断言功能。对于JUnit,这是org.junit.Assert。它通常为传递测试失败提供了更多功能,并且它不需要根据您需要使用assert启用断言。

答案 2 :(得分:1)

尝试assertTrue()而不是assert()。此外,如果您的本地变量以大写字母开头命名,那只会让人感到困惑。

编辑:好的,你的考试发生了什么?我通常会期望在测试中发生这三件事中的任何一件:(1)安排(2)法案(3)断言,这样几乎可以肯定Assert作为最后发生的事情存在(除非对模拟对象有隐含的验证,也许)。看起来你的意思是使用在运行代码时使用-ea启用的断言,但这不是我期望在测试用例中看到的。

答案 3 :(得分:1)

断言关键字不应该抛出Exception,如果在JVM中启用了它,则抛出Error。它用于测试代码中的假设(即作为快速[读取:懒惰]进行防御性编程的方式),例如参数是否为null形式,落在可接受的值内,是有效的URL等等,并且不应该是用于自动(单元)测试。为此,您应该使用测试框架Assert class。