質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

4402閲覧

API呼び出しのテストでhttpステータスが200以外のケース

yuu0802

総合スコア8

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/08/01 14:45

編集2020/08/02 04:11

やりたいこと

  • httpステータスが400,500のテストをしたい
  • エラーの場合に、body部にエラーメッセージが入ってくる仕様のため、Mockで設定したい
  • MockRestServiceServerのモックでは、200以外の場合、レスポンスボディを設定できないため、確認できるモックか他にやり方があるか知りたい。

httpステータスが200の場合 => こちらはうまくいく

java

1 @Test 2 public void GetExample() { 3 // 返却されるレスポンス 4 String jsonResponseBody = "{\"id\": 99999,\"name\": \"exampleUser\"}"; 5 6 // 呼び出す想定のURL 7 String callEndpoint = "https://get-end-point-url"; 8 9 MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 10 mockServer 11 .expect(requestTo(callEndpoint)) 12 .andExpect(method(HttpMethod.GET)) 13 .andRespond(withSuccess(jsonResponseBody, MediaType.APPLICATION_JSON_UTF8)); 14 15 // 呼出し準備 16 URI url = UriComponentsBuilder.fromHttpUrl(callEndpoint).build().toUri(); 17 HttpHeaders headers = new HttpHeaders(); 18 19 // restTemplateで実際に呼出し 20 ResponseEntity<User> responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(null, headers), User.class); 21 User responseUser = responseEntity.getBody(); 22 }

httpステータスが400の場合 => 困っている箇所

  • withBadRequest()では、jsonResponseBodyを設定できなくて困っている。httpステータス400は設定できている

java

1 @Test 2 public void GetExample() { 3 // 返却されるレスポンス 4 String jsonResponseBody = "{\"message\": \"パラメータが不正です。\"}"; 5 6 // 呼び出す想定のURL 7 String callEndpoint = "https://get-end-point-url"; 8 9 MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 10 mockServer 11 .expect(requestTo(callEndpoint)) 12 .andExpect(method(HttpMethod.GET)) 13 .andRespond(withBadRequest()); 14 15以下、略 16 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2020/08/01 22:56

MockRestServiceServerを使ったことはありません。 ただhttp/1.1クライアントで200以外でレスポンスボディが必要なケースを思いつきません。 モック側でも不要な設定機能を入れる意味がないので入ってないのではないでしょうか? 回答になってなくて申し訳ありませんが、まずは必要な理由などを説明するべきだと思います。
yuu0802

2020/08/01 23:56 編集

APIを作成する側(別の人)が、ボディ部に詳細なメッセージを設定するという話があったためです。 逆に質問になってしまって申し訳ありません、パラメーター不正の場合など、apiからのメッセージはレスポンスボディ以外のどこに設定されるのでしょうか? 例)「パラメーターが設定されていません」「桁数が足りません」などのメッセージ。
dameo

2020/08/02 00:29

個人的にはhttpは200でいいと思います。 http通信レベルでの問題ならhttpのステータスコードで、httpサーバー上に乗せてるサービスなら200のレスポンスボディに乗せた方が分かりやすいかと… 大昔から存在するステータスコードに現代のアプリやサービスのエラーコードをわざわざマッピングさせる必要はないと思うので…
yuu0802

2020/08/02 03:49

回答ありがとうございます。 ただ、今回は、200以外でも詳細なエラー内容を返す仕様になっています。 そのため、どのようにテストできるかを確認したいです。
dameo

2020/08/02 04:04

「できなくて困っている」では、本来あるべきなものがなくて困っているように読めてしまい、回答に躊躇する人が出ると思います。 最初に書いたとおり、「まずは必要な理由などを説明するべき」で「仕様で仕方なく確認する必要があり、それが可能な他のモックかその方法を知らないか?」というニュアンスを入れれば、回答する人もいるかもしれません。 特殊ケースなら自分で書いた方が早い気もしますが…
dameo

2020/08/02 04:38

仕方ない感じが全く伝わってきませんが、、、私から言うことは他にありません。
guest

回答1

0

ベストアンサー

Java

1mockServer 2 .expect(requestTo(callEndpoint)) 3 .andExpect(method(HttpMethod.GET)) 4 .andRespond(withBadRequest().body(jsonResponseBody));

MockRestServiceServer の振る舞い定義を以上にしてはいかがでしょうか。

withBadRequest(), withServerError()DefaultResponseCreator class のファクトリなだけなので、
DefaultResponseCreator の持つメソッド呼び出しからボディ、ヘッダーなどの要素を追加することが可能です。

投稿2020/08/07 20:02

編集2020/08/08 04:03
kiino

総合スコア539

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu0802

2020/08/08 02:28

「MockRestServiceServer の振る舞いを定義」を定義するとは、自分で作成するということでしょうか? 「DefaultResponseCreator 」の「DefaultResponseCreator(HttpStatus statusCode)」はprotectedなので、自分のテストクラスでうまくつかえません。 理解がよくできなくて申し訳ありません。
kiino

2020/08/08 04:03 編集

説明が不十分で申し訳ございません 頂いた例だと、MockRestServiceServer を以下のようになる想定です(回答に関しても修正しました)。 ``` MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); mockServer .expect(requestTo(callEndpoint)) .andExpect(method(HttpMethod.GET)) .andRespond(withBadRequest().body(jsonResponseBody)); ``` > 「DefaultResponseCreator(HttpStatus statusCode)」はprotected 恐縮なのですが、こちらを把握できませんでした。 上で書いた方法で 「body メソッドなどの呼び出しがアクセス修飾子の関係で出来無い」 という意味でしたら、 使用されているライブラリのバージョンを教えてもらえますでしょうか。
yuu0802

2020/08/08 04:24

ありがとうございます。 取得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問