JUnit4:测试预期的异常

时间:2011-12-02 07:42:06

标签: java junit junit4

我正在尝试使用 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包中。

我错过了什么?

5 个答案:

答案 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)

CalcErrorCalculator的内部类。它不是由import calculator.*;导入的。您必须添加import calculator.Calculator.CalcError或限定CalcErrorexpected=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添加到方法签名中,否则编译器会抱怨该异常。