assaulter's diary

主にバイクについて

(オブジェクト指向修行シリーズ2)委譲メソッドのテストってどうやるんだ???

最近集約して委譲する厨になってきたassaulterです。ども。

こういう感じの委譲メソッドを実装した場合のテストってどうやるんだろうとふと思ったのですが、ぐぐっても良い感じの記事が出てこないのでどういうところで悩んでいるかを載せてみた。

自己解決したので追記しました。

public class Hoge {

    private HogeHoge hogeHoge;
	
	public Hoge() {
		this.hogeHoge = new HogeHoge();
	}
	/** コンポジでもっているクラスHogeHogeのフィールドに副作用を与えるメソッド */
	public void add(int y) { 
		hogeHoge.add(y);
	}
}

パターン1

このソースのaddメソッドは、HogeHogeクラスのフィールドに副作用を与えるメソッドなので、テストして確認するためにはこんな感じか

public class HogeTest {

    @Test
	public void test_add_1() {
		Hoge hoge = new Hoge();
		hoge.add(y);
		// ↓private で持ってるのでアクセスできない!
//		int actual = hoge.hogeHoge
//		assertEqual("テストできぬぅ!", expected, actual);
	}
}

アクセスできねーっす!テストできねーっすよ!

今回はこういう感じで逃げた

Strategyパターンっぽく書かれたコードならテストできる・・・

public class Hoge {

    private HogeHoge hogeHoge;
    
	public Hoge() {
		this.hogeHoge = new HogeHoge();
	}
    /** まさかの再代入 */
    public setHogeHoge(HogeHoge hogehoge) {
        this.hogeHoge = hogehoge;
    }
    
	/** コンポジでもっているクラスHogeHogeのフィールドに副作用を与えるメソッド */
	public void add(int y) { 
		hogeHoge.add(y);
	}
}

これどうなんすかねー?こうするとsetHogeHogeをつかってモックを入れることができるので導通テストはできます。んで、HogeHogeクラスのテストでaddメソッドの動作は保証すると。テストのためにカプセル化が壊れるのは本末転倒なのですが、多分設計が悪いんだろうなーと。

事故解決しますた

コンポジで持ってるクラスに副作用のある仕事をさせる場合、必ず外に結果が出るはずなので、それを見れば十分ですね。。。