java - 单元测试 : assert not work?

标签 java unit-testing junit

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

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

我四处搜索,发现 assert 是 java 内置的,而 assertNotNull 是 JUnit 支持的。但是我不明白为什么 assert 不提示空对象?

最佳答案

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

  • Java 中的assert 关键字是在1.4 中添加的,旨在允许验证类中的内部一致性。最佳实践建议是在私有(private)方法中使用它们来测试程序不变量。当断言失败时,会抛出 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 断言通过了,而在第二个示例中,它失败了。

关于java - 单元测试 : assert not work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039079/

相关文章:

java - hibernate不将实体类确定为字段变量

java - 如何删除 Java ArrayList 中具有偶数索引的所有元素

c# - Java 的 waitFor() 方法似乎挂起

unit-testing - 将 data-cy 添加到 extJs 中的元素

unit-testing - 有什么工具可以记录单元测试的Java对象吗?

Java 用反斜杠替换全部

具有并行支持的 C# 模拟框架

spring - 仅读取几次后,什么会导致 spring redis 出现 'Read timed out'?

java - 如何测试一个方法内部调用了不同的方法?

javascript - 自定义匹配器使 Jasmine 挂起