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

  • Java断言仅在使用
    -ea
    Java
    选项时启用
  • Junit断言将为特定类型(如
    assertEquals(“Foobar”、“f00bar”);
    )抛出一条好消息
  • assert
    如果未启用,将忽略异常,因为关联的代码将不会执行(忽略),但您必须“抛出”任何选中的异常

  • 一个失败的断言抛出
    AssertionError
    。抛出一个意外的throwable与传递并不完全相同。为什么要使用Java断言而不是JUnit断言?我喜欢后者。JUnit允许您使用@expected属性测试抛出的异常。java断言的问题是,它们被选择性地检查了。禁用它们不会执行。这里应该使用JUnit断言,我正在运行它,使用用于eclipse的JUnit插件。并且启用了-ea选项。您是否可以尝试运行应该失败的断言,以查看断言在您的运行中是否有效?例如:assert1==2So这是eclipse中的一些奇怪的怪癖。我预先删除了所有旧的runconfiguration,但仍然是一样的。必须重新启动eclipse。我接受了你的回答,因为据我所知,你是第一个真正回答这个问题的人。