オブジェクト接合部
レガシーコード改善ガイド (Object Oriented SELECTION)
- 作者: マイケル・C・フェザーズ,ウルシステムズ株式会社,平澤章,越智典子,稲葉信之,田村友彦,小堀真義
- 出版社/メーカー: 翔泳社
- 発売日: 2009/07/14
- メディア: 大型本
- 購入: 45人 クリック: 673回
- この商品を含むブログ (152件) を見る
これを読んでいて気になる所があったのでテスト。
4.3.3 オブジェクト接合部
この章はオブジェクト指向言語で、テストしたいメソッドの中に他のクラスのメソッドや自クラス内のメソッドを呼び出す記述がある時に、メソッド間の依存性を断つにはどうすれば良いかって話。
他クラスのメソッドを呼び出している場合は、テスト対象クラス以外のクラスはインターフェース切って、擬似オブジェクト作るのが有効。それは知ってた。
もう一つ。自クラスのメソッドを呼び出してる場合は、テスト対象クラスを継承したクラスを作って、テスト対象メソッドから呼び出されているメソッドをオーバーライドして擬似メソッド化すると良いらしい。
自分の中でちょっとどうなるか曖昧な部分があったので、とりあえずテスト。
テスト対象クラス。
package com.hello.world; public class ExtendClassTest { public void methodA(){ methodB(); } public void methodB(){ System.out.println("親クラス"); } }
ExtendClassTestクラスのmethodA()がテスト対象。
これはメソッド内部でmethodB()を呼び出してるため、その振る舞いがmethodB()に依存する。
この依存を断ち切るためにExtendClassTestを継承したクラスExtendClassTest2を作る。
package com.hello.world; public class ExtendClassTest2 extends ExtendClassTest { public void methodB(){ System.out.println("子クラス"); } }
ここで、テスト対象でないmethodB()のみをオーバーライドする。
そして、このExtendClassTest2のテストクラスを作成し、ExtendClassTest2のオブジェクトが持つテスト対象メソッドmethodA()を実行してみる。
package com.hello.world; import junit.framework.TestCase; public class ExtendClassTest2Test extends TestCase { public void test(){ new ExtendClassTest2().methodA(); } }
すると結果は
子クラス
うん、スッキリした。