我有一种方法,在特定的处理过程中,它希望保留某些不变量
为了保持这个微不足道,让我们说在代码处理过程中的第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
?如果是这种情况,我应该提出什么例外?
答案 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();
}