Java assert语句是否包含异常?
我有以下测试:Java assert语句是否包含异常?,java,exception,assert,Java,Exception,Assert,我有以下测试: @Test public void testValues() { User user = new User(); // user.getCode().equals("CODE"); assert user.getCode().equals("CODE"); } 此测试的预期行为将失败,因为getCode尚未初始化,因此计算结果为null。我希望抛出NullPointerException。但事实并非如此,而是测试通过了 取消对该行的注释后,测试将按预期失败,
@Test
public void testValues() {
User user = new User();
// user.getCode().equals("CODE");
assert user.getCode().equals("CODE");
}
此测试的预期行为将失败,因为getCode
尚未初始化,因此计算结果为null
。我希望抛出NullPointerException
。但事实并非如此,而是测试通过了
取消对该行的注释后,测试将按预期失败,出现NullPointerException
那么,我的想法是错误的,还是出了什么问题
我使用EclipseJUnit插件运行测试。我还在
Windows下启用了-ea选项→ 偏好→ JAVA→ JUnit
,因此应该启用断言。在进行JUnit测试时,您应该使用。内置的断言是另一回事。试试这样看看会发生什么
@Test
public void testValues() {
User user = new User();
Assert.assertEquals(user.getCode(), "CODE");
}
您将看到测试失败。您以前的代码没有抛出,很可能是因为JVM没有启用断言(-ea标志)。默认情况下,Java虚拟机将忽略所有
assert
s。这也是您可以测试的:使用-ea
运行与您的问题相同的代码,我怀疑您忘记了在运行时启用断言(java工具的-ea
选项,或者在运行时配置中的某个地方(如果通过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。不,断言不会吞并异常。如何运行测试?可能在您的r运行中禁用了断言。 我在Intellij Idea上运行了你的测试,收到一个异常 我建议您使用org.easytesting.fest-assert。这允许您编写如下断言:
assertThat(user.getCode()).isEqualTo("CODE");
或者更复杂的东西,比如:
assertThat(user.getCode()).containsIgnoringCase("CODE");
这样,当断言失败时,您也会得到一个更详细的异常。对于Junit测试,不要使用
assert
。使用assertEquals
等
-ea
Java
选项时启用assertEquals(“Foobar”、“f00bar”);
)抛出一条好消息assert
如果未启用,将忽略异常,因为关联的代码将不会执行(忽略),但您必须“抛出”任何选中的异常一个失败的断言抛出
AssertionError
。抛出一个意外的throwable与传递并不完全相同。为什么要使用Java断言而不是JUnit断言?我喜欢后者。JUnit允许您使用@expected属性测试抛出的异常。java断言的问题是,它们被选择性地检查了。禁用它们不会执行。这里应该使用JUnit断言,我正在运行它,使用用于eclipse的JUnit插件。并且启用了-ea选项。您是否可以尝试运行应该失败的断言,以查看断言在您的运行中是否有效?例如:assert1==2So这是eclipse中的一些奇怪的怪癖。我预先删除了所有旧的runconfiguration,但仍然是一样的。必须重新启动eclipse。我接受了你的回答,因为据我所知,你是第一个真正回答这个问题的人。