assert语句是否吞下异常?

时间:2014-09-15 13:01:14

标签: java exception assert

我有以下测试:

@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选项,因此应该启用断言。

4 个答案:

答案 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等。

  1. 只有在使用-ea java选项时才会启用Java声明。
  2. Junit断言会为某些类型(如assertEquals("Foobar", "f00bar");
  3. 抛出一条好消息 如果未启用,
  4. assert将忽略异常,因为相关代码将不会被执行(忽略),但您必须" throw"任何已检查的例外。