テスト駆動開発 プログラミング Java

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

投稿日:2020年8月15日 更新日:

目的

TDDブートキャンプというセミナーに参加して面白かったので、
自分で何かやってみようと思った。

仕様

日付期間を保持するオブジェクトである。

開始日と終了日を持つ。

開始日と終了日を持つことをどうやってテストするかということが、
セミナー内でも少し話題に上がっていました。
よくやるパターンというのが、
「値をもっているならtoStringメソッドで出力させて、その結果と等価判定する」
というものだったので、それを実際にテストすると以下のようになります。

<テストコード>

・String型の日付(start_20200801等)は、共通で使用できるようにTestClassのフィールドとして保持。
・stringToDateメソッドは、日付を返す共通メソッド。

<実コード>

終了日は開始日を含む未来日である。

この日付期間オブジェクトは開始日と終了日を持つのですが、普通に考えると終了日は開始日より未来にあるべきだということになります。
そして、開始日と終了日が同じということはあり得るので、終了日は開始日を含んだ未来の日付として保持されるという仕様にしました。

<テストコード>

<実コード>

テストコードで@Nestedアノテーションをclassにつけてメソッドを中にまとめることで、テスト結果をネストさせて表現できるようになります。

ある日付期間と等価であること判定する。

この日付期間オブジェクトは、別の日付期間オブジェクトと等価であるかを判定できるとします。
判定は、自オブジェクトの開始日/終了日と、別の日付期間オブジェクトの開始日/終了日が共に同日であれば等価とみなします。

<テストコード>

<実コード>

ある日付が日付期間の範囲内であることを判定する

日付期間オブジェクトが、ある特定の日付を範囲内に含むんでいるかを判定できるようにします。
ここでは、開始日を含む以降であり、終了日を含む以前としました。

<テストコード>

<実コード>

ある日付期間が全て含まれていることを判定する

日付期間オブジェクトが、別の日付期間オブジェクトの開始日/終了日を完全に内包していることを判定できるようにします。
言葉で表現すると解釈に違いがでてしまう可能性がありますが、TDDでは値で表現してしまえるのが良いところです。

<テストコード>

<実コード>

開始日と終了日が共に範囲内であれば、完全に内包していると言えることをコードでうまく表現できています。

ある日付期間の一部が含まれていることを判定する

これは思い付きで考えた機能で、日付期間の部分一致のようなものです。
日付期間オブジェクト同士で、重なっている日付があるかを判定します。

<テストコード>

<実コード>

ガード節にすることでわかり易く表現できています。
このように、完全に外れていたらFalseを返し、そうでなければ一部を含んでいるはずなのでTrueが返るようにしています。

実行結果

Greenですね♪

ソースコード ダウンロード

Githubに公開しています。
https://github.com/TakumiKondo/parts/tree/master/src/period

TDDを実践してみてわかったこと

・テストコードを先に書くので、仕様を明確にする習慣が身に付く。
・実コードが正しいかについて確信が持てる。
・コードの変更(リファクタリング含め)が怖くなくなる。


⇒ テスト駆動開発を身に着けたいのならこれは必須の書です!

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

ランキング評価する

-テスト駆動開発, プログラミング, Java
-

執筆者:


comment

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

CAPTCHA


関連記事

PC, タイピング, パソコン

コミュニティ内のハッカソンに参加した体験談

クローズドなコミュニティ内で行われたハッカソンに参加してきました。 ハッカソンは短期間(短時間)で要件定義から実装までを行うイベントです。 ハッカソンに参加することになったきっかけは「要件定義から実装 …

【Bootstrap】入力フォームを作成しよう!

概要 SpringBootチュートリアルで作成した各画面の入力フォームをBootstrapに置き換えます。 また、containerを使用することで容易にグリッドシステムを導入できます。 実装 検索画 …

【Java入門】Consumerの使い方まとめ

概要 Consumer<T>は消費者と呼ばれる関数型インターフェースで、acceptメソッドを持ちます。 消費者というだけあって戻り値がありません。 また、引数はT型を1つとります、   …

【TemplateMethodパターン】売上レポートをテキストとHTML形式で出力分けする事例

概要 デザインパターンのTemplateMethodパターンの事例です。 デザインパターンは増補改訂版 Java言語で学ぶデザインパターン入門で学ぶことができますし、Qiitaでも取り上げられています …

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

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

SpringFramworkの良書

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

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