3

我有一种方法,在特定的处理点期间,它期望保留某些不变量。
为了保持这一点,让我们假设在代码处理期间的 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

4 回答 4

2

你不应该try-catch在单元测试中有一个块。如果您希望出现异常,请使用注释:

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

您将不得不使用不同的异常,例如IllegalArgumentsException因为 JUnit在AssertionError内部使用。我发现IllegalArgumentsException更能描述实际出了什么问题。

于 2012-05-05T14:10:36.280 回答
1
boolean shouldFail = false;
try {
    callTheMethod();
    shouldFail = true;
}
catch (AssertionError e) {
    // expected
}
if (shouldFail) {
    fail();
}

但是如果条件是不变量,那么它应该始终为真,因此永远不应该抛出 AssertionError,因此您甚至不能对其进行单元测试。如果您能够对其进行测试,则意味着该不变量并不是真正的不变量,并且根据调用顺序或提供的参数,该条件可能为真。因此,您应该更喜欢 IllegalStateExcetion 而不是 AssertionError。

于 2012-05-05T14:12:07.687 回答
0
 > should I not be using the AssertionError in my code in the first place? 

没有JUnit 使用 AssertionError 及其后代来告诉 junit-runner 测试失败。(类似的适用于 .net NUnit-runner)

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

我会使用通用的异常之一IllegalArgumentsException或创建自己的异常

于 2012-05-05T14:14:31.453 回答
0

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

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

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

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

A. high 和 low 是完全可分的——测试用例代码不会抛出 AssertionError。

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

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

B. high 和 low 不是完全可分的 - 代码应该抛出 AssertionError 但测试用例不应该。

boolean failed;
try {
    //test case setup
    yourClass.callYourMethod(4,2);
    failed = true;
} catch (AssertionError e) {
    failed = false;
}
if (failed) {
    fail();
}
于 2012-05-05T14:21:09.520 回答