以下の要約。
http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/
Unit Test しやすいクラスは、クラス間の依存グラフにおいて、 終端に位置するクラス(以下、leafクラス)である。 なぜなら、それだけを Unit Test することができるから。 例えば、以下のようなクラス。
class House {
private boolean isLocked;
private boolean isLocked() {
return isLocked;
}
private boolean lock() {
isLocked = true;
}
}
しかし、以下のようなクラスでは、Kitchenクラスを生成せずに、 House クラスだけを生成できない。 理由は、House のロジック内に、Kitchen の new 演算子が 含まれているから。 そのため、House クラスのみを Unit Test することができない。
class House {
private final Kitchen kitchen = new Kitchen();
private boolean isLocked;
private boolean isLocked() {
return isLocked;
}
private boolean lock() {
kitchen.lock();
isLocked = true;
}
}
Houseだけを個別に Unit Test するには、偽の Kitchen で、Houseを生成する必要がある。
class House {
private final Kitchen kitchen;
private boolean isLocked;
public House(Kitchen kitchen) {
this.kitchen = kitchen;
}
private boolean isLocked() {
return isLocked;
}
private boolean lock() {
kitchen.lock();
isLocked = true;
}
}
上のように、new演算子をロジックから取り除けば、 テストを簡単に行える。 Kitchen のモックを作れば、Houseだけを Unit Test できる。 これにより、leaf クラスでなくても、個別にテストを行える。
どこで、new演算子を使えばいいかというと、 以下のようにFactoryクラスを作ってやればよい。
class ApplicationBuilder {
House build() {
return new House(new Kitchen(
new Sink(),
new Dishwasher(),
new Refrigerator())
);
}
}
Main メソッドでは、このFactoryを使ってオブジェクトの依存関係を 生成すればよい。
class Main {
public static void main(String...args) {
House house = new ApplicationBuilder().build();
house.lock();
}
}
No comments:
Post a Comment