JavaではDIコンテナを用いることでオブジェクトのモック化が可能になります。具体的にはDIコンテナの定義ファイルをテスト用と本番用の各々に準備します。
リスト1〜リスト7がSpring Frameworkを用いた場合のサンプルです。
リスト1:モック/本番クラス呼び出し側クラスのSpring定義ファイル
<beans>
<bean id="authService" class="AuthService" >
<property name="cardAuth" >
<ref bean="creditCardAuth" />
</property>
</bean>
</beans>
リスト2:モッククラスが記述されたSpring定義ファイル
<beans>
<bean id="creditCardAuth" class="CreditCardAuthMock" />
</beans>
リスト3:本番用クラスが記述されたSpring定義ファイル
<beans>
<bean id="creditCardAuth" class="CreditCardAuthImpl" />
</beans>
リスト4:Javaでの呼び出し側クラス
public class AuthService {
private CreditCardAuth cardAuth;
public boolean buy(int itemNo, String cardNo){
boolean card_result = cardAuth.auth(cardNo);
(中略)
}
(中略)
}
リスト5:Javaでのインターフェイス
public interface CreditCardAuth {
public boolean auth(String cardNo);
}
リスト6:Javaでのモッククラス
public class CreditCardAuthMock implements CreditCardAuth {
public boolean auth(String cardNo) {
return true
}
}
リスト7:Javaでの本番クラス
public class CreditCardAuthImpl implements CreditCardAuth {
public boolean auth(String cardNo) {
//クレジットカード処理を記述
(中略)
}
}
テスト時にはリスト2の定義ファイルを読み込み、リスト4のAuthServiceクラスからはリスト6のCreditCardAuthMockクラスを呼び出すようにします。本番時にはリスト3の定義ファイルを読み込み、AuthServiceクラスからリスト7のCreditCardAuthImplクラスを呼び出すようにするのです。
こうすることで、テスト中にはモックオブジェクトが呼び出しクラスに注入され、本番時には本物のオブジェクトが注入されるようにできます。
|