現在、私は春ベースのアプリケーションに取り組んでいます。アプリケーションの多くの目的のために、いくつかの単体テストがあります。問題は、アプリケーションで実際の統合テストを実行するための解決策が見つからないことです。
例を挙げましょう:
現在のテストでは、特定のコントローラーのリクエストを設定し、それらのコンポーネントをハンドラーに渡します。
// setup request
request.setMethod("GET");
request.setRequestURI("/customer");
request.addHeader("Accept", "application/json");
request.addHeader("Authorization", "Basic xyz"); // base_64
handlerAdapter.handle(request, response, myController);
しかし、これは実際の統合テストではありません。なぜなら、私が言っているのは、リクエストがあり、myControllerがこのリクエストを処理する必要があるからです。
私が本当にテストしたいのは次のとおりなので、これは問題です。
リクエストがあります。アプリケーションでこのリクエストを処理する必要があります。実行中のアプリケーションと「/customer」スプリングへのリクエストの場合、どのコントローラーが私のリクエストを解決するかをディスパッチするため、コントローラーを指定したくありません。私は、自分がブラウザまたはバックエンドにリクエストを送信する別のクライアントであることをシミュレートしたいと思っています。
私がこれをテストしたい理由は、テストされた機能が「現実の世界」では機能しないにもかかわらず、そうでなければある種のテストに合格するからです。
この例を理解してもらうことができます。この点で、テストは本番環境の実行とは異なります。
パラメータを使用してフォーム内にファイルをアップロードするとします。私のコントローラー機能はこれです:
@RequestMapping(value="/{id}", method = RequestMethod.PUT, headers="content-type=multipart/form-data")
public ResponseEntity<String> createFromMyForm(@PathVariable("id") Long id, @RequestParam String myParameter, @RequestParam MultipartFile myFile) {
//...
}
RequestMethod.PUTを見てください。これは、ファイルをアップロードするためのhtml標準がPOSTであるため、本番ビルドでは機能しません。
私のユニットテストでは、これを行っています:
// setup request
MockMultipartHttpServletRequest multipartRequest = new MockMultipartHttpServletRequest();
MockHttpServletResponse multipartResponse = new MockHttpServletResponse();
// Open file
final FileInputStream fis = new FileInputStream("img/test.png");
MockMultipartFile multipartFile = new MockMultipartFile(
"myParameter", fis);
// generate multipart mock
multipartRequest.addFile(multipartFile);
multipartRequest.addParameter("json", "test");
// send request
handlerAdapter.handle(multipartRequest, multipartResponse, controller);
問題:テストは合格しますが、合格しないはずです。このテストに合格する理由はいくつかあります。まず、リクエストを指定します。リクエストがあるとは言いませんが、代わりにMultipartRequestがあると言わなければなりません。これにより、ディスパッチャサーブレットはisMultipartRequest()などの関数でtrueを返します。本番稼働では、PUTメソッドにマルチパート要求がないため、falseが返されます。さらに、この要求を処理するコントローラーを再度指定します。
他の例もあるかもしれませんが、私が言いたいのは、HTMLプロトコルやその他すべてを含む実際の条件下でアプリケーションをテストする方法はありますか?
どんな助けでも本当にありがたいです!
前もって感謝します