デザインパターン 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


関連記事

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

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

ExcelをA1で拡大率100%にするツール(サブフォルダ全て)

たくましゅくじょさんのところで公開されていた、 「エクセルで全シートの拡大率を100%にしA1セルを選択するマクロ」 をサブフォルダ全てに対応させたバージョンを作成しました。 会社の納品ドキュメントを …

【Java】TDDして汎用的な部品を作成する(日付期間オブジェクト)

目的 TDDブートキャンプというセミナーに参加して面白かったので、 自分で何かやってみようと思った。 仕様 日付期間を保持するオブジェクトである。 開始日と終了日を持つ。 開始日と終了日を持つことをど …

【JdbcTemplate】IN句に値を入れて複数件取得する方法

JdbcTemplateでIN句に毎回異なる数の値をセットして、 複数のレコードを取得する場合は、「NamedParameterJdbcTemplate」で取得することができます。 コード例 [cra …

【Spring】バリデーション時に、入力値を保持する方法

登録画面で「登録」ボタンを押した後、 バリデーションで引っ掛かってエラーになっても 入力内容を画面に保持して置く方法についてです。 テンプレートエンジンは、Tymeleafを使用しています。 方法とし …

記事を探す

SpringFramworkの良書

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

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