我有以下测试:
@Test
public void testValues() {
User user = new User();
// user.getCode().equals("CODE");
assert user.getCode().equals("CODE");
}
此测试的预期行为将失败,因为getCode
尚未初始化,因此评估为null
。我希望抛出NullPointerException
。但这不会发生,而是测试通过了。
取消注释该行,测试按预期失败NullPointerException
。
所以,我的观念是错误的,还是出了问题?
我使用eclipse JUnit插件运行测试。我也在Windows → Preferences → Java → JUnit
下启用了-ea选项,因此应该启用断言。
答案 0 :(得分:3)
进行JUnit测试时,您应该使用JUnit assertions。内置的assert
是另一回事。尝试这样的事情来看看会发生什么。
@Test
public void testValues() {
User user = new User();
Assert.assertEquals(user.getCode(), "CODE");
}
您将看到测试失败。您以前的代码并没有抛出,很可能是因为JVM没有启用断言(-ea标志)。默认情况下,Java虚拟机将忽略所有assert
。您也可以测试一下:使用-ea
运行您在问题中使用的相同代码。
答案 1 :(得分:2)
我怀疑你已经忘记在运行时启用断言(-ea
工具的java
选项,或者如果在IDE中运行,则在运行时配置中的某个位置启用断言。如果未启用断言,则整个表达式将被完全忽略(未执行),因此您无法获得NPE。
例如,使用以下代码:
class Temp {
public static void main(String args[]) throws Exception{
System.out.println("Testing");
(new Temp()).testValues(null);
System.out.println("Done");
}
public void testValues(String str) {
assert str.equals("CODE");
}
}
如果我在没有启用断言的情况下运行它,自然不会发生异常,因为永远不会评估str.equals("CODE")
。
但是如果我在启用断言的情况下运行它,我会按预期得到一个NPE。
答案 2 :(得分:2)
不,断言不会吞下异常。你如何运行测试?也许断言在你运行中被禁用。 我在Intellij Idea上进行了测试并收到了一个例外。
我建议你使用org.easytesting.fest-assert。这允许你写这样的断言:
assertThat(user.getCode()).isEqualTo("CODE");
或更复杂的东西,如:
assertThat(user.getCode()).containsIgnoringCase("CODE");
这样当断言失败时,你也会得到更详细的例外。
答案 3 :(得分:0)
请勿使用assert
进行Junit测试。使用assertEquals
等。
-ea
java
选项时才会启用Java声明。assertEquals("Foobar", "f00bar");
)assert
将忽略异常,因为相关代码将不会被执行(忽略),但您必须" throw"任何已检查的例外。