LoginSignup
0
0

mockmvcでUnparsable JSON stringが発生する & Response Bodyが常に空になる

Last updated at Posted at 2021-09-09

概要

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;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0