Советы, необходимые для рефакторинга устаревшего кода - PullRequest
1 голос
/ 02 апреля 2020

Я работаю с устаревшей кодовой базой, и я хотел бы использовать TDD для добавления новых функций к коду, который я сейчас изменяю.

Обратите внимание, что в текущей кодовой базе НЕ имеется UT'S.

У меня есть класс Calculator со следующей реализацией:

public final class Calculator extends CalculatorBase {
    public Calculator(Document document) throws Exception {
        super(document);
    }

    public int Multiply(int source, int factor) {
        return source * factor;
    }
}

Этот класс наследует от следующего базового класса:

public class CalculatorBase {
    public CalculatorBase(Document document) throws Exception {
        throw new Exception("UNAVAILABLE IN UT CONTEXT.");
    }
}

ПРИМЕЧАНИЕ. Конструктор на самом деле делает много вещей, которые я бы не хотел делать в UT. Для простоты я заставил конструктор выдать исключение.

Теперь я хочу добавить функцию Add в класс Calculator. Эта функция выглядит следующим образом:

public int Add(int left, int right) {
    return left + right;
}

UT для этого конкретного фрагмента кода должно быть очень простым.

@Test
@DisplayName("Ensure that adding numbers DOES work correctly.")
void addition() throws Exception {
    // ARRANGE.
    Calculator calculator = new Calculator(null);

    // ACT.
    int result = calculator.Add(1, 1);

    // ASSERT.
    Assertions.assertEquals(2, result);
}

Поскольку конструктор базы CalculatorBase действительно выдает исключение, модульное тестирование НИКОГДА не пройдет.

Сложность создания этого тестируемого компонента заключается в том, что класс CalculatorBase автоматически создается инструментом, поэтому исходный код этого класса не может быть изменен.

Какие (детские) шаги я должен предпринять, чтобы убедиться, что метод Add класса Calculator может быть протестирован? Цель состоит в том, чтобы сделать весь проект тестируемым и даже избавиться от автоматически сгенерированных вещей, но я хотел бы использовать TDD везде, где это возможно, для постепенного рефакторинга кода.

Можно утверждать, что я может сделать метод Add stati c, так как он не использует никаких зависимостей класса Calculator, но код просто быстро добавляется вместе. В реальном сценарии функция Add является чем-то еще, что потребляет состояние класса Calculator.

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете:

  1. Создать новый метод как stati c
  2. Создать временный альтернативный конструктор, прокомментированный как «Только для тестирования»
  3. Выполнить рефакторинг класс для удаления зависимости
  4. Подавить его с помощью PowerMock

Но самый безопасный способ сделать это - создать тест скаффолда. Это создает класс, даже если конструктор имеет зависимости. Возможно, вам придется нарушить инкапсуляцию с помощью сеттеров только для тестирования. После того, как класс действительно хорошо протестирован, вы можете провести рефакторинг класса, добавить более качественные тесты и, наконец, удалить тест грязных скаффолдов. В зависимости от сложности класса это может быть подходящим или чрезмерным.

...