home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Groovy/JavaのSingletonをテストする

Groovy/JavaのSingletonをテストする

Groovy / JavaのSingletonをテストする
id: 1125 所有者: msakamoto-sf    作成日: 2012-11-18 11:08:53
カテゴリ: Groovy Java TDD 

Groovy/Maven/Java + TestNG Example ではGroovyを使うことでJavaのprivateフィールドを簡単に参照・更新出来ることを紹介しました。
そこで、より実用的なシーンとしてxUnit等による単体テストの作成でしばしばぶつかる、JavaのSingletonデザインパターンのmock/stub化をGroovyで攻略してみます。

サンプルコードは以下のGistにUPしています。

以下のようなディレクトリ構成になります。

gjt3/
  pom.xml
  src/
    main/java/gjt3/Singleton.java
    test/groovy/gjt3/SingletonTest.groovy

Singleton.javaはSingletonの手抜き実装です。privateなコンストラクタにgetInstance()経由で文字列を渡して、インスタンスを区別出来るようにしてます。

Groovy + TestNGで組み立てたテストコードの内容を紹介します。

// 最初の2つは、通常のSingletonの動作確認です。
Singleton s1 = Singleton.getInstance("s1");
Assert.assertEquals(s1.getArg(), "s1");
// getInstance()したのは、上で初期化した"s1"を返すはずです。
Singleton s2 = Singleton.getInstance("s2");
Assert.assertEquals(s2.getArg(), "s1");

// Groovyでprivateなコンストラクタを呼び出しインスタンス化します。
Singleton s3 = new Singleton("s3");
Assert.assertEquals(s3.getArg(), "s3");
// これを、privateなSingletonインスタンス保管用のフィールドにセットします。
Singleton.instance = s3;

// getInstance()してみると、上で上書きした"s3"のインスタンスが返されます。
Singleton s4 = Singleton.getInstance("s4");
Assert.assertEquals(s4.getArg(), "s3");

当然ですがテストはpassします。

ただし注意点として、SingletonはClassのフィールドにセットされますので、テストコード中でこれを弄った後は、必ず元のインスタンスに戻しておく必要があります。テストコード中でmock用のインスタンスに差し替え、そのままにしてしまうと、後に続くテストコードが失敗する可能性があります。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-11-18 11:23:20
md5:ff6c2d6055002128dce31ba52a9323ff
sha1:7275551204f1b10d46b41ebaadf6fb708d42fed1
コメント
コメントを投稿するにはログインして下さい。