JUnit:在被测试的类中启用断言

时间:2009-11-25 16:10:20

标签: java junit assertions

我在JUnit测试套件中没有失败的Java assert语句中有点几次,因为在JUnit的JVM实例中没有启用断言。要清楚,这些是实现中的“黑盒子”断言(检查不变量等),而不是JUnit测试本身定义的断言。当然,我想在测试套件中捕获任何这样的断言失败。

显而易见的解决方案是非常小心在我运行JUnit时使用-enableassertions,但我更喜欢更强大的解决方案。另一种方法是将以下测试添加到每个测试类中:

  @Test(expected=AssertionError.class)
  public void testAssertionsEnabled() {
    assert(false);
  }

有更自动的方法来实现这一目标吗? JUnit的系统范围配置选项?我可以在setUp()方法中进行动态调用吗?

4 个答案:

答案 0 :(得分:21)

在Eclipse中,您可以转到WindowsPreferencesJavaJUnit,每次新的启动配置时,都可以选择添加-ea创建。它还将-ea选项添加到调试配置中。

复选框旁边的全文是

  

在创建新的JUnit启动时,向VM参数添加'-ea'   构造

答案 1 :(得分:5)

我建议三种可能的(简单?)修复,在快速测试后对我有效(但你可能需要检查使用静态初始化块的副作用)

1。)将静态初始化程序块添加到依赖于启用断言的那些测试用例

import ....
public class TestXX....
...
    static {
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
   ...
   @Test(expected=AssertionError.class)
   ...
...

2.。)创建一个基类,所有测试类都扩展,需要启用断言

public class AssertionBaseTest {
    static {
        //static block gets inherited too
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
}

3。)创建一个运行所有测试的测试套件

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    //list of comma-separated classes
    /*Foo.class,
    Bar.class*/
})
public class AssertionTestSuite {
    static {
        //should run before the test classes are loaded
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
    public static void main(String args[]) {
        org.junit.runner.JUnitCore.main("AssertionTestSuite");
    }
}

答案 2 :(得分:4)

或者,您可以编译代码,以便断言不能。在Java 6下,您可以使用"fa.jar – Force assertion check even when not enabled",这是我的一个小黑客。

答案 3 :(得分:1)

正如我的一位朋友说的那样......如果你要关掉它,为什么要花时间写一个断言呢?

鉴于逻辑,所有断言语句应该变为:

if(!(....))
{
    // or some other appropriate RuntimeException subclass
    throw new IllegalArgumentException("........."); 
}

以您可能想要的方式回答您的问题: - )

import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;


@RunWith(Suite.class)
@Suite.SuiteClasses({
        FooTest.class,
        BarTest.class
        })
public class TestSuite
{
    @BeforeClass
    public static void oneTimeSetUp()
    {
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
    }
}

然后运行测试套件而不是每个测试。这应该(在我的测试中有效,但我没有读取JUnit框架代码的内部结果)导致在加载任何测试类之前设置断言状态。