我在JUnit测试套件中没有失败的Java assert
语句中有点几次,因为在JUnit的JVM实例中没有启用断言。要清楚,这些是实现中的“黑盒子”断言(检查不变量等),而不是JUnit测试本身定义的断言。当然,我想在测试套件中捕获任何这样的断言失败。
显而易见的解决方案是非常小心在我运行JUnit时使用-enableassertions
,但我更喜欢更强大的解决方案。另一种方法是将以下测试添加到每个测试类中:
@Test(expected=AssertionError.class)
public void testAssertionsEnabled() {
assert(false);
}
有更自动的方法来实现这一目标吗? JUnit的系统范围配置选项?我可以在setUp()
方法中进行动态调用吗?
答案 0 :(得分:21)
在Eclipse中,您可以转到Windows
→Preferences
→Java
→JUnit
,每次新的启动配置时,都可以选择添加-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框架代码的内部结果)导致在加载任何测试类之前设置断言状态。