テスト駆動開発 プログラミング 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


関連記事

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

概要 Javaでもっともよく使う基本的なオブジェクト型はStringではないでしょうか。 Stringには便利なメソッドが多数用意されているので、それらをうまく使えるようになることはコーディングの上達 …

ITエージェントが保有している案件数を比較してみました

概要 ITエージェントが保有している案件はどのくらいあるのか? また、Java案件に参画するにはどのエージェント経由が有利か? というちょっとした興味を元に調べてみました。 調査実施日:2021年5月 …

Facadeパターンの使い道をコードとクラス図で説明します。

Facadeパターンはどんな役に立つか? 簡単にいうと、複数の処理のまとめ役。 なので、依頼1つでいろんな仕事をやってくれる点で役に立つ。 Facadeパターンの要件 Facadeクラスはあくまでサブ …

CompsiteパターンでHTMLタグを実現するには?

Compositeパターンに応用できそうなものとして、 HTMLタグなんかいいかと思いコーディングしてみました。   クラス図   説明 Compositeパターンは再帰構造を実現 …

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

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

記事を探す

SpringFramworkの良書

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

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