簡體   English   中英

JUnit4:測試預期的異常

[英]JUnit4 : testing for expected exception

我試圖用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包中。

我錯過了什么?

CalcError是一個內部類,所以你需要使用

@Test(expected=Calculator.CalcError.class)

請參閱嵌套類

編輯:你需要將測試方法聲明為拋出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是一個經過檢查的異常。

CalcErrorCalculator的內部類。 它不是由import calculator.*; 您必須添加import calculator.Calculator.CalcError或限定CalcErrorexpected=Calculator.CalcError.class )。

將公共課作為內部課程並不是一個好主意。 您應該將其移動到自己的文件中。 只應嵌套私有類。 您可以通過使用Calculator.CalcError.class訪問Error類,但我強烈建議不要使用它。

除此之外,我認為JUnit缺乏一些異常檢測功能,因為您無法設置消息。 我通過捕獲它們然后在應該拋出異常的方法調用之后調用Assert.fail來對異常進行單元測試:

try {
    someMethod();
    Assert.fail("SomeException should have been thrown");
catch(SomeException se) {
}

由於CalcError是Calculator的內部類,因此您需要像這樣引用它

@Test(expected=Calculator.CalcError.class)
public void testDivision() {

由於這是一個經過檢查的異常,您需要向方法簽名添加throws Exception ,否則編譯器會抱怨異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM