我正在尝试使用 JUnit4 测试抛出异常的方法。以下是代码段:
package unit_tests;
import org.junit.Test;
import calculator.*;
@Test(expected=CalcError.class)
public void testDivision() {
Calculator myCalc = new Calculator(10, 0);
myCalc.setOperation(Calculator.Operation_e.DIVIDE);
myCalc.getResult();
}
问题在于行@Test(expected=CalcError.class)
:我收到以下错误:
Class<CalcError> cannot be resolved to a type
以下是CalcError
的定义方式:
package calculator;
public class Calculator {
public class CalcError extends Exception {
// ...
}
public double getResult() throws CalcError {
// ...
}
}
我不明白为什么CalcError
不是类型,即使单元测试位于unit_tests
包中且计算器位于calculator
包中。
我错过了什么?
答案 0 :(得分:7)
CalcError是一个内部类,所以你需要使用
@Test(expected=Calculator.CalcError.class)
请参阅Nested Classes。
编辑:您需要将测试方法声明为抛出Calculator.CalcError:
@Test(expected=Calculator.CalcError.class)
public void testDivision() throws Calculator.CalcError {
Calculator myCalc = new Calculator(10, 0);
myCalc.setOperation(Calculator.Operation_e.DIVIDE);
myCalc.getResult();
}
这是为了取悦编译器,因为Calculator.CalcError是一个经过检查的Exception。
答案 1 :(得分:2)
CalcError
是Calculator
的内部类。它不是由import calculator.*;
导入的。您必须添加import calculator.Calculator.CalcError
或限定CalcError
(expected=Calculator.CalcError.class
)。
答案 2 :(得分:1)
将公共课作为内部课程并不是一个好主意。您应该将其移动到自己的文件中。只应嵌套私有类。
您可以使用Calculator.CalcError.class
访问Error类,但我强烈反对它。
除此之外,我认为JUnit缺少一些异常检测功能,因为您无法设置消息。我通过捕获它们然后调用来对异常进行单元测试
在应该抛出异常的方法调用之后Assert.fail
:
try {
someMethod();
Assert.fail("SomeException should have been thrown");
catch(SomeException se) {
}
答案 3 :(得分:1)
由于CalcError是Calculator的内部类,因此您需要像这样引用它
@Test(expected=Calculator.CalcError.class)
public void testDivision() {
答案 4 :(得分:1)
由于这是一个经过检查的异常,您需要将throws Exception
添加到方法签名中,否则编译器会抱怨该异常。