【发布时间】:2020-04-02 11:34:47
【问题描述】:
我正在使用旧代码库,我想使用 TDD 为我当前正在更改的代码添加新功能。
请注意,当前代码库没有任何 UT。
我有一个具有以下实现的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 中做这些事情。 为简单起见,我让构造函数抛出异常。
现在我想在 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 base 的构造函数确实抛出了异常,所以这个单元测试永远不会通过。
使这个可测试的棘手部分是CalculatorBase 类是由工具自动生成的,因此该类的源代码无法修改。
我应该采取什么(婴儿)步骤来确保可以测试Calculator 类上的Add 方法?目标是使整个项目可测试,甚至摆脱自动生成的东西,但我想尽可能使用 TDD 以便逐步重构代码。
有人可能会争辩说,我可以将Add 方法设为静态,因为它不使用Calculator 类的任何依赖项,但代码只是快速添加到一起。 Add 函数在实际场景中是消耗Calculator 类状态的其他东西。
【问题讨论】:
-
我相信,顾名思义,测试驱动开发是一门用于开发软件的学科。您可以在没有 TDD 的情况下重构和单元测试您的代码。
-
那么我该如何重构它,并确保我没有破坏任何东西?
标签: java code-cleanup legacy-code