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


関連記事

no image

GitでIndexが壊れたときの直し方

これは自分の環境用の備忘録です。 (状況) Virtual BOX内のGit環境において、INDEXが0KBになっている。(INDEXが壊れている) (対処方法) リモート環境から新しくCloneして …

Thymeleafで1000円単位をカンマ区切りで表示する方法

Thymeleaf(テンプレートエンジン)で金額などの数値を 1000円単位のカンマ区切りで表示する方法です。 ここでは、カンマ区切りの機能はオブジェクト側で実装し、 Tymeleaf(View)は表 …

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

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

VBAが書けるまでにどのくらいかかったか?

これからVBAを学ぼうとしている人向けに参考情報として書きます。 前提 前提として、私の経歴を少し書いておきます。 ・PHPでのWeb開発1年未満 ・Javaの簡易なアプリは作れる ・SQLも理解して …

【Bootstrap】一覧表示をデザインしよう!

概要 一覧表示をデザインします。 Bootstrapにはすぐに使える便利なクラスが用意されているので、それらを使用して実現します。 【SpringBootチュートリアル】#7~ 検索画面の作成に変更を …

SpringFramworkの良書

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

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