Singletonをテストする

シングルトンは、前のテストの結果が後のテストにまで影響してしまうからテストしにくいという。これはSingletonのインスタンスがテストメソッド間で共有されてしまうことに起因する。

ならば、テスト間で影響を受けないようにそれぞれのテストメソッドでSingletonのインスタンスをユニークにしてあげられればテストしやすくならないか?

というわけで、JUnitのTestSuiteを拡張したSingleton用のTestSuiteを作ってみた。

仕組みはとても簡単で、テストメソッドごとにまったく新しいクラスローダを生成するようにしてTestCaseをextendsしたクラスを生成するだけ。たとえ同一のクラスでも、異なるクラスローダでロードされたクラスは別扱いとなる。これでテストメソッドごとにSingletonをユニークにできる。クラスローダとかは、そのままJUnitのものを拝借。

使い方もいたって簡単。suite()を定義して、JUnitのTestSuiteの変わりにSingleton用に拡張したTestSuiteをreturnしてやればいい。継承を必要としないので、他のフレームワーク等で独自に拡張されたTestCaseとも親和性はよいと思う。

public class TestSuiteForSingleton extends TestSuite {
・・・
}

public class HogeTest extends TestCase {
・・・
    public static Test suite() {
        return new TestSuiteForSingleton(HogeTest.class);
    }
}

これでSingletonのテストはバッチリ!
うーん... 副作用とかはないよなぁ。。。というか、いわずもがな?いやそれ以前に破綻してる?
ソースupしたいけど、あげるところがない...