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

问题描述 投票:0回答:3

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

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

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

java unit-testing junit
3个回答
10
投票

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


4
投票
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)并选择选项“在创建新的 JUnit 启动配置时将 '-ea' 添加到 VM 参数”。请注意,此设置不会更改现有的 JUnit 启动配置,为此您需要手动将“-ea”设置添加到每个此类启动配置的 VM 参数框中。


1
投票

这是 Eclipse 中的一个

bug

© www.soinside.com 2019 - 2024. All rights reserved.