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

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

投稿日:2020年7月30日 更新日:

シングルトンパターンはインスタンスが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

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

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

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

【Javaサンプル】自動販売機を作成(Level1)

Javaの勉強用サンプルです。 テーマは自動販売機。 プログラミング初心者向けに書いています。   自動販売機を題材として選んだ理由 自社研修で行っている 自社研修で自動販売機を作成したので …

【Java入門】判定処理(if, if else, switch文)の使い方まとめ

概要 判定処理には、if / if-else / switch文があります。 これらはとても基本的な判定処理ですが、基本的な使い方に加えて、ちょっとした構文上のTipsや注意点についても解説していきま …

【Java】MySQLから取得した日付をフォーマット変換して表示する方法

MySQLからSELECTしてきた日付データ(DateTime型)を、 「yyyy年MM月dd日 hh時mm分ss秒」のフォーマットで表示する方法です。 コード [crayon-63d7e6b2d5b …

junit, テスト, junit5

【Junit5】表示名のカスタマイズ(@DisplayName)

概要 Junit5で表示名をカスタマイズする方法です。 Junit4については以下を参考にしてください。  ↓ https://irof.hateblo.jp/entry/20130124/p1 でき …

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

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

SpringFramworkの良書

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

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