JUnit4: тестирование на ожидаемое исключение - PullRequest
2 голосов
/ 02 декабря 2011

Я пытаюсь протестировать с 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 ]

7 голосов
/ 02 декабря 2011

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 - это проверенное исключение.

2 голосов
/ 02 декабря 2011

CalcError является внутренним классом Calculator. import calculator.*; не импортируется. Вам нужно будет добавить import calculator.Calculator.CalcError или указать CalcError (expected=Calculator.CalcError.class).

1 голос
/ 02 декабря 2011

Поскольку это проверенное исключение, вам необходимо добавить throws Exception к сигнатуре метода, в противном случае компилятор будет жаловаться на исключение.

1 голос
/ 02 декабря 2011

Так как CalcError является внутренним классом Калькулятора, вы должны ссылаться на него следующим образом:

@Test(expected=Calculator.CalcError.class)
public void testDivision() {
1 голос
/ 02 декабря 2011

Публичные классы в качестве внутренних классов не очень хорошая идея. Вы должны переместить это в свой собственный файл. Только частные классы должны быть вложенными. Вероятно, вы могли бы получить доступ к классу Error, используя Calculator.CalcError.class, но я бы настоятельно рекомендовал это сделать.

Кроме того, я думаю, что JUnit не хватает возможностей для обнаружения исключений, так как вы не можете установить сообщение. Я тестирую исключения, перехватываю их и вызываю Assert.fail после вызова метода, который должен вызвать исключение:

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