我在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。
答案 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。