75. Покрытие тестами метода calc #
🔥 Нужно продумать тесты для функции calc(a, b, operation)
по документации.
/*
* Выполняет одну из операций "+", "-", "/", "*" для переданных параметров
* В любой непонятной ситуации, в т.ч. невозможность разделить нацело, бросается exception
*/
public Integer calc(Integer a, Integer b, String operation);
Спойлеры к решению
Подсказки
+
, -
, *
, /
.💡 Обработай граничные условия: деление на ноль, остаток от деления ≠ 0.
💡 Проверь
null
-аргументы.💡 Проверь некорректный оператор (например,
"%"
, null
, пустая строка).💡 Тестируй большие числа и переполнение.
💡 Используй JUnit 5 + AssertJ для удобных ассертов.
💡 Для исключений —
assertThrows
.Решение
Набор тестов (примерно 10–12 штук):
Сложение:
calc(2, 3, "+") == 5
.Вычитание:
calc(10, 4, "-") == 6
.Умножение:
calc(6, 7, "*") == 42
.Деление нацело:
calc(8, 2, "/") == 4
.Деление с остатком:
calc(7, 2, "/")
→ exception.Деление на ноль:
calc(5, 0, "/")
→ exception.Неизвестная операция:
calc(5, 2, "%")
→ exception.Оператор
null
: → exception.Аргументы
null
(a=null
илиb=null
) → exception.Граничные значения:
calc(Integer.MAX_VALUE, 1, "+")
→ exception или переполнение (проверка).Негативные числа:
calc(-3, -7, "*") == 21
.Идемпотентность: повторный вызов с одинаковыми аргументами даёт тот же результат.
Пример JUnit 5 теста:
class CalcServiceTest {
private final CalcService service = new CalcService();
@Test
void shouldAddNumbers() {
assertThat(service.calc(2, 3, "+")).isEqualTo(5);
}
@Test
void shouldThrowWhenDividingByZero() {
assertThrows(ArithmeticException.class,
() -> service.calc(5, 0, "/"));
}
@Test
void shouldThrowOnUnsupportedOperation() {
assertThrows(IllegalArgumentException.class,
() -> service.calc(5, 2, "%"));
}
}
Покрытие позитивных и негативных сценариев.
Ясные названия тестов.
Используются
assertThrows
иassertThat
.