单元测试:断言不起作用?

时间:2012-04-06 04:21:30

标签: java unit-testing junit

我正在申请UnitTest一段时间,今天我遇到了一些非常奇怪的事情。考虑以下代码:

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

我google了一下,发现assert是java内置的,而assertNotNull是JUnit支持的。但我无法理解为什么断言不抱怨null对象?

3 个答案:

答案 0 :(得分:10)

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

  • 1.4中添加了Java中的断言关键字,旨在验证类中的内部一致性。最佳实践建议是在私有方法中使用它们来测试程序不变量。当断言失败时,抛出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:\workspace\test>java -cp bin;lib\junit-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:\workspace\test>java -ea -cp bin;lib\junit-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断言传递,而在第二个示例中,它失败。

答案 1 :(得分:4)

默认情况下,Java VM禁用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)并选择选项" Add' -ea'创建新的JUnit启动配置时的VM参数"。请注意,此设置不会更改现有的JUnit启动配置,您需要手动添加" -ea"设置为每个此类启动配置的VM参数框。

答案 2 :(得分:1)

这是一个错误

它的a bug日食。