デザインパターン Singleton テスト駆動開発 プログラミング Java

SingletonパターンをJUnitでテストする

投稿日:

シングルトンパターンはインスタンスが1つであることを保証する設計です。
Junitを使って、本当に1つだけなのかを検証してみます。
またその手順をテスト駆動開発に従った手順(RedGreen→リファクタリング)で行います。

テストコード

2つのインスタンスを生成し、assertThatで比較します。

Red

Singletonクラスを作成し、自身のインスタンスを保持するフィールド(_singleton)を設定します。
getInstanceメソッドで取得できるようにstaticとし、自身のインスタンスをnew Singleton()でリターンします。

テストを実行すると、2つのインスタンスの参照が異なるため別物だと判断されRedになります。

Green

インスタンスの生成は、_singletonフィールドがnullである場合のみとします。
そうすれば生成されるインスタンスは1つだけにできます。(修正箇所 参照)

テストを実行してみましょう。
Greenになります。

リファクタリング

Greenになったのであれば、リファクタリングができます。
2つほどリファクタリングしてみます。

スレッドセーフ化

シングルトンパターンで議論される話題として、スレッドセーフであることが挙げられます。
よく見ると、synchronized がありませんので、これを追加しましょう。

追加修正後、テストを実行するとGreenであることが確認できます。

フィールド名

_sigletonを別の名前に変えてみましょう。
_instance としてみます(getInstanceメソッド内の変更も行います)。

テストを実行するとGreenであることが確認できます。
もしRedになったのであれば、どこかに修正誤りがあるので確認してみてください。

まとめ

・シングルトンパターンはインスタンスが1つであることを保証する設計である。
・テスト駆動設計においては、RedGreen→リファクタリングの順で行う。

ソースコード

Github

-デザインパターン, Singleton, テスト駆動開発, プログラミング, Java
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

【Spring】JSの変更を反映させる方法

Spring Bootのおいて、JavaScriptの変更を反映させる方法です。   設定 application.properties application.propertiesに、以下 …

Javaで数値(int)を部分一致判定する

文字列に変換して判定します。 <方法> ・matchesメソッドで正規表現使う。 ・containsメソッドに判定文字を渡す。 また、メソッドに切り出すと、intを変換する処理を個別に書かなくてよくな …

AbstractFactoryパターンをenumで生成するメリット

AbstractFactoryパターンの説明には、実行時引数に文字列を渡したり、フラグでif-else判定する例をよく見かける。 しかし、どんなFactoryが生成可能を知らない担当者がFactory …

【Java】TreeSetの使い方(順序付けSet)

TreeSetの使い方 基本的な使い方はHashSetと同じなので、以下を参照下さい。 【Java】HashSetの使い方いろいろ TreeSetは何も指定せずにインスタンスを生成すると、Collec …

Eclipseでタブを半角スペースに変換する便利プラグイン!

Eclipseでタブを半角スペースに変換する便利プラグインに、 AnyEdit Toolsというものがあります。 導入方法を以下に記載致しましたので参考にして下さい。   どういうものか? …

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。