Что значит «выйти за диапазон Integer»?

«Что значит «выйти за диапазон Integer»?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В контексте тестирования Java-приложений "выйти за диапазон Integer" означает, что в ходе выполнения операции (часто в расчётах, обработке ввода или интеграции с другими системами) возникает значение, выходящее за пределы, которые может хранить 32-битный целочисленный тип int.

  • Диапазон int в Java: от -2,147,483,648 (Integer.MIN_VALUE) до 2,147,483,647 (Integer.MAX_VALUE).
  • Что происходит при переполнении: Java не выбрасывает исключение по умолчанию. Вместо этого происходит целочисленное переполнение (integer overflow), и значение "заворачивается" по модулю. Например:
    int max = Integer.MAX_VALUE; // 2,147,483,647
    System.out.println(max + 1); // Выведет -2,147,483,648 (Integer.MIN_VALUE)

Как я тестирую такие сценарии:

  1. Граничные значения и негативные тесты:
    • Намеренно подаю на вход методы значения, близкие к MAX_VALUE и MIN_VALUE.
    • Тестирую операции умножения, которые могут дать большой результат (например, 1_000_000 * 3_000).
  2. Анализ требований: Уточняю у разработчика, ожидаются ли в бизнес-логике такие большие числа. Если да, то правильным решением будет использование long или BigInteger.
  3. Проверка обработки ошибок: Если в коде используется Math.addExact(), Math.multiplyExact() (которые бросают ArithmeticException при переполнении), пишу тесты, которые проверяют, что это исключение корректно обрабатывается и не ломает приложение.

Пример тест-кейса:

  • Действие: Вызвать метод calculateTotal(int quantity, int price) с параметрами quantity = 1_000_000, price = 2_500.
  • Ожидаемый результат: Либо метод использует long для расчёта и возвращает корректный результат 2_500_000_000, либо выбрасывает понятное исключение/возвращает код ошибки, если используется int.