Java: способы тестирования нескольких статических методов без повторения теста?

#java #unit-testing #static

#java #модульное тестирование #статический

Вопрос:

У меня есть класс factorial внутри, это два статических метода:

factorialImperative() amp; factorialRecursion,

есть ли способ протестировать оба из них без необходимости повторять тест для каждого метода?

Я хочу посмотреть, есть ли способ сделать это, не нарушая принцип DRY.

Комментарии:

1. Это довольно просто в Spock, но немного более неуклюже (и с худшей отчетностью) в обычном JUnit. Подсказка: вы захотите использовать функциональный интерфейс.

2. Итак, я попробовал реализовать интерфейс. В основном интерфейс, содержащий тест для обоих методов. Затем другой тестовый класс, который реализует интерфейс, и из-за этого я застрял. Любой пример был бы весьма признателен.

Ответ №1:

Обычно один модульный тест проверяет одну «единицу» программного обеспечения, обычно один метод. Это делается для быстрого выявления проблемы в случае сбоя теста. Если у вас есть модульный тест, который вызывает только один метод, и тест завершается неудачно, то проблема, очевидно, в этом методе. Если у вас есть модульный тест с несколькими методами, то в общем случае вам нужно будет исследовать глубже, чтобы понять, в чем проблема. И даже больше, если в тесте тура есть несколько утверждений, потому что вы хотите проверить вывод нескольких методов, тогда, если первое утверждение завершится неудачей, все остальные утверждения даже не будут выполнены. Чтобы показать пример

 public void testFactorials() {
    Assert.assertEquals(6, factorialImperative(3));
    Assert.assertEquals(6, factorialRecursion(3));
}
  

Если приведенный выше тест завершится неудачей при первом утверждении, вы ничего не узнаете о правильности второго метода.

Вы можете попробовать сделать следующее, хотя

 public void testBoth() {
    Assert.assertEquals(factorialImperative(10), factorialRecursion(10));
}
  

Но в этом случае, если оба метода имеют целочисленное переполнение, вы не сможете его перехватить.