繁体   English   中英

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

[英]Unit test: assert not work?

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

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

我四处搜索,发现 assert 是 java 内置的,而 assertNotNull 是 JUnit 支持的。 但我不明白为什么断言不要抱怨 null object?

Hoang,我认为您对 Java 语言断言和 JUnit 断言有点困惑。

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

  • JUnit 也有断言,在org.junit.Assert package 中以许多不同的 static 方法的形式存在。这些旨在验证给定测试的结果。 这些断言还会抛出 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 断言(默认)的运行的 output:

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 断言通过了,而在第二个示例中,它失败了。

Java 虚拟机默认禁用断言关键字(请参阅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 | 首选项 | Java | Junit)和 select 选项“在创建新的 JUnit 启动配置时将‘-ea’添加到 VM arguments”。 请注意,此设置不会更改现有的 JUnit 启动配置,为此您需要手动将“-ea”设置添加到每个此类启动配置的 VM 参数框中。

这是一个错误

eclipse 内部的一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM