Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit:在被测类中启用断言_Java_Junit_Assertions - Fatal编程技术网

Java JUnit:在被测类中启用断言

Java JUnit:在被测类中启用断言,java,junit,assertions,Java,Junit,Assertions,我已经被Javaassert语句咬了几次,这些语句在JUnit测试套件中没有失败,因为在JUnit的JVM实例中没有启用断言。需要明确的是,这些是实现内部的“黑盒”断言(检查不变量等),而不是JUnit测试本身定义的断言。当然,我希望在测试套件中捕获任何此类断言失败 显而易见的解决方案是,无论何时运行JUnit,都要非常小心地使用-enableassertions,但我更喜欢更健壮的解决方案。一种替代方法是向每个测试类添加以下测试: @Test(expected=AssertionError

我已经被Java
assert
语句咬了几次,这些语句在JUnit测试套件中没有失败,因为在JUnit的JVM实例中没有启用断言。需要明确的是,这些是实现内部的“黑盒”断言(检查不变量等),而不是JUnit测试本身定义的断言。当然,我希望在测试套件中捕获任何此类断言失败

显而易见的解决方案是,无论何时运行JUnit,都要非常小心地使用
-enableassertions
,但我更喜欢更健壮的解决方案。一种替代方法是向每个测试类添加以下测试:

  @Test(expected=AssertionError.class)
  public void testAssertionsEnabled() {
    assert(false);
  }
有没有更自动的方法来实现这一点?JUnit的系统范围配置选项?我可以在
setUp()
方法中进行动态调用吗

我提出了三种可能的(简单的?)修复方法,在快速测试后对我有效(但您可能需要检查使用静态初始值设定块的副作用)

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");
    }
}

正如我的一个朋友所说。。。如果要关闭断言,为什么要花时间编写它呢

根据该逻辑,所有assert语句应为:

if(!(....))
{
    // or some other appropriate RuntimeException subclass
    throw new IllegalArgumentException("........."); 
}
以您可能想要的方式回答您的问题:-)


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

或者,您可以编译代码,使断言无法关闭。在Java 6下,您可以使用我的一个小技巧。

在Eclipse中,您可以转到
Windows
→ <代码>首选项→ <代码>Java→
JUnit
,每次创建新的启动配置时,它都可以添加
-ea
。它还将
-ea
选项添加到调试配置中

复选框旁边的全文为

在创建新JUnit启动时,将'-ea'添加到VM参数 配置


这在我的情况下不起作用。它依赖于类的加载顺序。抱歉,这将无法按预期工作。加载和初始化类时必须启用断言,并且在类加载器上设置默认断言状态只会影响稍后加载的类。这只是一个一般性问题。如果您真的想对代码进行彻底的单元测试,那么您不应该在启用断言和不启用断言的情况下进行测试吗?断言真正有用的一件事是引入意想不到的副作用。您是如何运行JUnit测试用例的?如果您有一些构建管理器(ant、maven),那么通过添加此开关应该很简单default@Alexander:这个主意不错@抖动:你当然是对的。Maven似乎默认启用断言。我以前没有注意到Eclipse对此有一个偏好设置。问题是,这些设置可能会改变你的背后…你考虑我的重新设计的答案?我为您的问题提出了三种可能的解决方案,它们都可以工作(经过测试),除非断言将代码的速度降低到问题的程度,否则我宁愿一直使用它们。先决条件/后决条件和任何其他类型的断言语句-如果您花时间编写它,为什么要关闭它?如果它是一个先决条件,那么我的论点是它不值得断言,应该检查并作为IllegalArgumentException或该先决条件的任何适当异常抛出。但是,后置条件完全值得断言,假设它检查的内容超过@NotNull。断言对于私有方法仍然有用,在私有方法中,您希望在开发过程中检查先决条件,而不是在生产过程中检查。除非有很好的理由,否则更喜欢公共接口上的异常。好主意!但是,如果它在Eclipse中不起作用,它对我来说就不起作用了。您的Eclipse中有任何类型的单元测试插件吗?我找不到这个选项。不,它是标准Eclipse安装的一部分。您使用哪个版本的Eclipse?对不起,这是很久以前的事了。我的电脑上再也没有安装Eclipse了:(我使用的是Juno。它在Windows->Preferences->Java->JUnit中
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);
    }
}