我刚刚应用了一段时间的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/