单元测试:断言不起作用



我应用UnitTest只是一段时间,今天我遇到了一些非常奇怪的事情。考虑以下代码:

TestObject alo = null;
assert alo != null; // Pass!!!
Assert.assertNotNull(alo); // Fail, as expected.

我在谷歌上搜索了一下,发现assert是java内置的,而assertNotNull是JUnit支持的。但我不明白为什么assert不抱怨null对象?

Hoang,我认为您在Java语言断言和JUnit断言之间有点混淆。

  • Java中的assert关键字是在1.4中添加的,用于验证类中的内部一致性。最佳实践建议是在私有方法中使用它们来测试程序不变量。当断言失败时,会抛出java.lang.AssertionError,通常不会被捕获。当时的想法是,它们可以在调试期间启用,在生产代码中禁用(这是默认的),但坦率地说,我认为它们从来没有真正流行起来。我没有见过它们被大量使用。

  • JUnit在org.JUnit.Assert包中也有许多不同静态方法形式的断言。这些旨在验证给定测试的结果。这些断言还会抛出java.lang.AssertionError,但JUnit框架的设置是为了捕捉和记录这些错误,并在测试运行结束时生成所有失败的报告。这是断言的更常见用法,IMO.

很明显,您可以使用任何一个,但JUnit断言更具表达性,您不必担心启用或禁用它们。另一方面,它们并不是真正用于业务代码的。

编辑:下面是一个有效的代码示例:

import org.junit.Assert;
import org.junit.Test;
public class MyTest {
  @Test
  public void test() {
    Object alo = null;
    assert alo != null         // Line 9
    Assert.assertNotNull(alo); // Line 10
  }
}

以下是在禁用Java断言(默认)的情况下运行的输出:

c:workspacetest>java -cp bin;libjunit-4.8.1.jar org.junit.runner.JUnitCore MyTest
JUnit version 4.8.1
.E
Time: 0.064
There was 1 failure:
1) test(MyTest)
java.lang.AssertionError:
  at org.junit.Assert.fail(Assert.java:91)
  ...
  at MyTest.test(MyTest.java:10)
  ...

下面是启用Java断言的运行(-ea):

c:workspacetest>java -ea -cp bin;libjunit-4.8.1.jar org.junit.runner.JUnitCore MyTest
JUnit version 4.8.1
.E
Time: 0.064
There was 1 failure:
1) test(MyTest)
java.lang.AssertionError:
  at MyTest.test(MyTest.java:9)
  ...

请注意,在第一个示例中,Java断言通过,在第二个示例中失败。

默认情况下,Java虚拟机禁用assert关键字(请参阅http://docs.oracle.com/cd/E19683-01/806-7930/6jgp65ikq/index.html)。默认情况下,不同的Java工具可以配置为启用断言,也可以不配置为启用声明。

Eclipse目前在运行JUnit测试时默认不启用断言。(请参阅上的讨论https://bugs.eclipse.org/bugs/show_bug.cgi?id=45408-不这样做的原因是为了保持向后兼容性)。

然而,由于Eclipse 3.6,Eclipse中有一种简单的方法可以确保JUnit测试默认启用断言。打开JUnit首选项(Windows|preferences|Java|JUnit)并选择选项"在创建新的JUnit启动配置时将'-ea'添加到VM参数"。请注意,此设置不会更改现有的JUnit启动配置,为此,您需要手动将"-ea"设置添加到每个此类启动配置的VM参数框中。

这是一个错误

这是eclipse内部的一个bug。

最新更新