kaakaa Blog

この世は極楽 空にはとんぼ

オブジェクト接合部

レガシーコード改善ガイド (Object Oriented SELECTION)

レガシーコード改善ガイド (Object Oriented SELECTION)

これを読んでいて気になる所があったのでテスト。

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();
	}
}

すると結果は

子クラス

うん、スッキリした。