私は、レガシーコードベースを働いていると私は、私は現在、変更てることをコードに新しい機能を追加するために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の中でやっていないたいもの、の多くを行います。簡単にするために、私はコンストラクタが例外をスロー作りました。
今、私は電卓クラスに「追加」機能を追加したいです。この関数は、次のようになります。
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
、それは、任意の依存関係を使用していないため、メソッドの静的Calculator
クラスを、コードだけですぐに一緒に追加されます。Add
この関数は、実際のシナリオでは、の状態消費し、何か他のものであるCalculator
クラスを。
あなたはできる:
- staticとして新しいメソッドを作成します。
- 「唯一のテストのため」とコメントした一時的な代替コンストラクタを作成します。
- 依存関係を削除するには、クラスをリファクタリング
- それを抑制PowerMock
しかし、それを行うための最も安全な方法は、足場のテストを作成することです。これは、コンストラクタは、依存関係を持っている場合でも、クラスを構築します。あなただけのテストのためのセッターとencapslationを解除する必要があるかもしれません。いったんクラスは本当によくあなたは、クラスをリファクタリング、より良いテストを追加し、最終的に汚れた足場のテストを削除することがテストされています。クラスの複雑さに応じて、これはappropiateや行き過ぎかもしれません。