如果我想使用JUnit,是否禁止AssertionErrors?

时间:2012-05-05 13:59:27

标签: java unit-testing junit assert

我有一种方法,在特定的处理过程中,它希望保留某些不变量 为了保持这个微不足道,让我们说在代码处理过程中的第X点,变量high和变量low必须是可分的。
所以在我做的代码中:

if(high % low != 0){  
  throw new AssertionError("Invalid state of low and high [low = "+ low+ ", high=" + high+"]");   
}   

在使用JUnits进行单元测试期间,我有一个测试用例来测试它 所以我做了:

try {
//At this point I know for sure that the low and high are not divible so process() should throw an Assertion Error
   process();  
   fail();  
} 
catch(AssertionError e){        
}

但测试用例是绿色的! 但是我意识到junit由于fail而引发了一个断言错误,但我抓住了它,因此测试用例是通过而不是失败。
从我的观点来看,在我的代码中引发的正确错误也是AssertionError,而不是一些通用错误,例如IllegalArgumentsException
那么有没有办法解决这个问题,以便测试用例可行或者我不应该首先在我的代码中使用AssertionError?如果是这种情况,我应该提出什么例外?

4 个答案:

答案 0 :(得分:2)

单元测试中不应该有try-catch块。如果您希望异常使用注释:

@Test(expected=Exception.class)
public void youTestMethod() {
   ...
}

您必须使用其他异常,例如IllegalArgumentsException,因为JUnit会在内部使用AssertionError。我发现IllegalArgumentsException更能描述实际出错的地方。

答案 1 :(得分:1)

boolean shouldFail = false;
try {
    callTheMethod();
    shouldFail = true;
}
catch (AssertionError e) {
    // expected
}
if (shouldFail) {
    fail();
}

但是如果条件是不变的,那么它应该总是为真,因此应该永远不会抛出AssertionError,因此你甚至不能对它进行单元测试。如果你能够测试它,则意味着不变量实际上不是一个不变量,并且条件可能是真的,这取决于调用的顺序或提供的参数。因此,您应该优先于AssertionError上的IllegalStateExcetion。

答案 2 :(得分:0)

 > should I not be using the AssertionError in my code in the first place? 

JUnit使用AssertionError及其后代告诉junit-runner测试失败。 (Simmilar适用于.net NUnit-runner)

 > If this is the case, what exception should I be raising? 

我会使用IllegalArgumentsException之类的通用Exceptoin或创建我自己的例外

答案 3 :(得分:0)

是的,您的代码和JUnit之间存在冲突,但它很容易解决。

当您编写JUnit测试用例时,正如您已经推断的那样,当测试用例失败时会抛出AssertionError。

为了让JUnit知道您的测试用例已经过去,测试代码不应该在任何其他异常/错误上抛出AssertionError。

将会有两个测试用例(至少) -

一个。高和低完全可以分割 - 测试用例代码不会抛出AssertionError。

//test case setup
yourClass.callYourMethod(4,2);
//verification

这里,如果测试用例行为正确,则没有AssertionError,JUnit知道它已经通过。

B中。高和低不完全可分 - 代码应该抛出AssertionError,但测试用例不应该。

boolean failed;
try {
    //test case setup
    yourClass.callYourMethod(4,2);
    failed = true;
} catch (AssertionError e) {
    failed = false;
}
if (failed) {
    fail();
}