概要
mockmvcで以下のようにレスポンス値を確認するようなコードを書いていました。
(簡略化しています。)
Sample sample = new Sample("sample");
mvc.perform(get(URI)
.param("userId", "1")
.accept(MediaType.APPLICATION_JSON)
).andExpect(status().isOk())
.andExpect(content().json(JsonOutput.toJson(sample)));
実際にはjson化できているにもかかわらず、以下のエラーが出てしまい頭を抱えてしまいました。
Condition failed with Exception:
org.json.JSONException: Unparsable JSON string:
原因
「JSONに変換できないこと」が原因ではありますが、期待値として設定しているsampleがJSON化できないのではなく、テスト対象のエントリポイントから帰ってくるBody値が空だったため、こちらのエラーがでています。
自分が若干悩んだポイントとしては、レスポンス値が空の場合でもAssertが出るのでは?というところですが、
Assertionを出すより先に以下の部分でResponseBodyのJSONパース処理が走って、JSONのパースエラーが出るみたいです。
https://github.com/spring-projects/spring-framework/blob/8f33450df20352ad6eabe632c082d9b02cb46c9a/spring-test/src/main/java/org/springframework/test/web/servlet/result/ContentResultMatchers.java#L227
また、テスト対象のエントリポイントが常に空のBodyを返すという問題についてですが、原因としては、対象コントローラーを以下のように@MockBeanで呼んでしまっており、期待通りにリクエストができていなかったことが問題でした。
@MockBean
private TargetController target;
実際には、以下のようにAutowiredで呼ぶ必要があります。
@Autowired
private TargetController target;