Singletonで単体テスト

久しぶりにJava。Singletonパターンをつかったクラスで設定をしているprotectedメソッドをオーバーライドした上で単体テストをどうやるかで困っている。

public class SomeClass{
private static final SomeClass instance = new SomeClass();

private SomeClass(){
this.someMethod();
}

public SomeClass getInstance(){
  return this.instance;
}

protected void someMethod(){
//何かの処理
}
}

これだと通常のクラスのようにテストクラス内で

SomeClass some = new Some(){
protected void someMethod(){
//上書き処理
}
};

ということがgetInstance()でインスタンスを生成しないといけないので,できない。ネットで調べるとDIパターンを使うのも一手らしい。

public interface SomeClass{
protected void someMethod();
}

public class SomeClassImpl implements SomeClass{
//お決まりの処理

protected void someMethod(){
//なんらかの処理
}
}

確かにこれでSomeClassImplのモックをつくればオーバーライドできるけど何か面倒だ。まぁ,いい手が他に思いつかないしこれでいってみよう。