JUnitテスト:findById()のthenReturn()でOptionalをモックする方法

こんにちは、さるまりんです。

最近Javaと仲良しなのでJunitでテストすることが増えました。モックって便利ですね。

データベースに絡むテストをしていて悩んだことをメモしておきます。

Spring DATA JPAでのクエリを試していた時、

SomeData findBySomeId(Long someId);

は、

SomeData someData = new SomeData();
...
when(repo.findBySomeId(1L)).thenReturn(someData);

のように記述できるのですが、

Optional<SomeData> findById(Long id);

はどうでしょうか?

Spring Data JPAで1件だけ結果を返すメソッドの戻り値の型が、nullかもしれないしnullじゃないかもしれないを表すOptionalだったのでどうしようかなと悩んでました。

結果は簡単でした。

Optional.of()を使うことでOptionalの返却をモックすることができます。

SomeData someData = new SomeData();
...
when(repo.findById(1L)).thenReturn(Optional.of(someData));

Spring Data JPAの自動実装されるメソッドの利用は楽なのですが、実際に何が起こっているのかをなんとなくでも把握してないと悩むなあと思いました。ちゃんとリファレンス読まないとですね。

読んでくださってありがとうございます。

それではまた!