JavaでOptional.orElseを使ったらテストに失敗した

Created 2020年6月18日11:05
Updated 2020年6月18日11:26
Categories Java

コード

nullableMethod1 がnullだったら nullableMethod2 の値を返すプログラムを書きました。

String str = Optional.ofNullable(some.nullableMethod1()).orElse(some.nullableMethod2());

テスト

nullableMethod1 で値を返して、 nullableMethod2 が呼ばれていないことを確認するテストを書きました。

when(some.nullableMethod1).thenReturn("testStr");
verify(some, never()).nullableMethod2();

しかし結果は失敗。 nullableMethod2 が何故か呼ばれています。

原因

orElseの中身が実行前に評価されていたことが原因でした。

つまり、nullableMethod1の実行時に予めnullableMethod2の結果も準備して、nullableMethod1がnullだったら返すみたいな動作になっていました。

評価される順番を考えたらそれはそうなのですが、そこまで頭が回らずハマってしまいました。

代わりにorElseGetを使うと、後から評価するように書くことができます。

String str = Optional.ofNullable(some.nullableMethod1()).orElseGet(() -> some.nullableMethod2());

コメントを投稿

コメント