Java тестирование делим на ноль - PullRequest
2 голосов
/ 21 сентября 2019

Я пытаюсь проверить функциональность деления на ноль.

Если я просто сделаю: System.out.println(5/0), я получу java.lang.ArithmeticException

Я пытаюсь проверить, что исключениебыл брошен.

Вот мой модульный тест:

 @Test(expected = ArithmeticException.class)
    public void given_divideByZeroInput_when_divideByZero_then_verify_throwing_exception() {
        MathClass sut = new MathClass();
        sut.div(10,0);
    }

, а мой div такой простой:

 public float div(int x, int y) {
        return (float) x/y;
    }

Однако модульный тест не пройден, заявив,:

java.lang.AssertionError: Expected exception: java.lang.ArithmeticException

Что я сделал не так?

Я знаю, что есть много способов проверить выброшенное исключение, но я пытаюсь придерживаться простого @Test(excepted = .. )

1 Ответ

7 голосов
/ 21 сентября 2019

Дж. Б. Низет нашел ответ:

Вы бросаете x на поплавок.Таким образом, вы делаете не целочисленное деление, как в первом фрагменте, а деление с плавающей запятой.И результат, таким образом, Бесконечность, а не исключение.

Но есть кое-что еще, чтобы объяснить:

    return (float) x/y;

означает

  1. преобразовать x в float
  2. выполнить вычисление ((float) x) / y с использованием арифметики с плавающей запятой
  3. вернуть значение

При удалении приведения:

    return x/y;

означает

  1. выполнить вычисление x/y с использованием целочисленной арифметики
  2. преобразовать значение в число с плавающей запятой (неявно!)
  3. вернуть значение

Так что естьна самом деле ряд (потенциальных) концептуальных ошибок, которые могли бы привести к совершенной вами ошибке.

  • Преобразование типов имеет более высокий приоритет, чем /.
  • Арифметическая операция, включающая int и float, выполняется с использованием 32-битной арифметики с плавающей запятой.(Операнд int будет расширен до float)
  • Расширение также происходит в «контексте назначения», а оператор return является контекстом назначения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...