テスト駆動開発 プログラミング 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入門】Predicateの使い方まとめ

概要 Predicateはtestメソッド持つ関数型インターフェースです。 引数を1つ受け取り、booleanを返します。   基本的な使い方 test(T t)には、ジェネリクスに指定する型を引数と …

【Java入門】例外処理の基本的な操作まとめ

概要 例外処理の基本的な知識と操作について記載しています。 例外処理の構文 try~catch~finally ◆基本構文

・fina …

【Java入門】プロジェクトの作成からHello, World!まで

概要 プログラミングの入門といえば「Hello, World!」です。 まずは最も簡単なプログラムを動かすことから始めていきましょう。   プロジェクトの作成 新規プロジェクト作成 新規で「Javaプ …

【Spring+Thymeleaf】リクエストパラメーターをControllerで受け取る方法

概要 Spring+Thymeleafにおいて、リクエストパラメーターをControllerで受け取るパターンを紹介します。 リクエストパラメーターのパターンは以下の通りです。 ・単一(inputタグ …

【Java】モジュールシステムの概要と実装例

概要 Javaのモジュールシステムについて、概念的なイメージと実際のコード例で理解を深めるための記事です。 読者はJava Silverの資格勉強中の方やJava入門者を想定しています。 内容は以下の …

■運営者プロフィール
IT業界10年のエンジニア。
PHP -> VBA -> Javaと渡り歩いてきて、今はJavaをメインにフリーランスエンジニアとして活躍中!

[保有資格]
・Java SE 11 Gold

一度はエンジニアを辞めざるを得なかった私が再びエンジニアとして復活した数奇な物語

SpringFramworkの良書

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

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