2016-04-12 20 views
9

私はAPIに一般的なフォームを投稿できることを確認するためのテストを書いています。MockMVCを介したフォームの投稿

私はかなりのデバッグを追加しましたが、実際のフォームで投稿されたデータに気付きました。 (ポストマン/ AngularJS又はE/W)のようmockMVC試験を行うこととは異なります

MvcResult response = mockMvc 
      .perform(post("/some/super/secret/url") // 
        .param("someparam1", "somevalue") // 
        .param("someparam2", "somevalue") //     
        .contentType(MediaType.APPLICATION_FORM_URLENCODED) // 
        .accept(MediaType.APPLICATION_JSON)) // 
      .andExpect(status().isOk()) // 
      .andReturn(); 

設定を正確生産に実行コンフィギュレーション、およびそのような同じです。しかし、私の傍受者が実際のテストで(mockMVCではなく)実際のテストでは、コンテンツは "someparam1 = somevalue & etc = encore"のようにフォーマットされます。

私は実際に内容がないようですが、要求のParams、私は彼らがGETのパラメータのように追加されていると仮定します。

これを正しくテストする方法を知っている人はいますか? FormHttpMessageConverterをサーブレットコンテキストに追加しても、フォームの投稿がSpringによって解析されていないように見えるので、この問題が発生しました。

+0

あなたが設定のように、サーバーといくつかのログの詳細に投稿する実際のデータは、それがより明確にするために、より詳細な情報を提供することはできますか?モックについては、あなたが正しいことを行っているようですが、モックテストのパラメタは、表示する投稿データの形式と同じ種類です。また、春のセキュリティのようなものがあるかどうか確認してください。次の手順を実行する前に、春のセキュリティを模擬するか、ログインを実行する必要があります。 –

+1

私はそういうものを使用していませんが、私が知ったことは、私の例が実際に間違っていることです。この場合someParam1とsomeParam2はクエリのパラメータ(URL)になります。私は、フォームのパラメータを使用したいので、URLENCODEDです。しかし、これはモデルやバリューマップからアクセスできるように見えます。だから私たちは回避策が必要になります(これはスプリングではない@FormParamとして使用されていた完全なスプリングMVCに移行されました)。 –

+0

また、投稿されたデータは、Mvcの部分の下の私の例のようでしたが、&and = –

答えて

10

、あなたのクラスパス上のApache HTTPComponentsのHttpClientを使用している場合、あなたはこのようにそれを行うことができます:あなたはHttpClientをしていない場合は、URLエンコード形式を構築する簡単なヘルパーメソッドでそれを行うことができます

mockMvc.perform(post("/some/super/secret/url") 
      .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
      .content(EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList(
        new BasicNameValuePair("someparam1", "true"), 
        new BasicNameValuePair("someparam2", "test") 
      ))))); 

エンティティ:

mockMvc.perform(post("/some/super/secret/url") 
      .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
      .content(buildUrlEncodedFormEntity(
     "someparam1", "value1", 
     "someparam2", "value2" 
    )))); 

このヘルパー機能付:

String buildUrlEncodedFormEntity(String... params) { 
    if((params.length%2)>0) { 
     throw new IllegalArgumentException("Need to give an even number of parameters"); 
    } 
    StringBuilder result = new StringBuilder(); 
    for(int i=0; i<params.length; i+=2) { 
     if(i>0) result.append('&'); 
     result.append(URLEncoder.encode(params[i]) 
      .append('=') 
      .append(URLEncoder.encode(params[i+1]); 
    } 
    return result.toString(); 
} 
+0

これは最高ではありませんが、解決策です。 Apache HTTPComponentsがなぜ必要なのか教えてください。私が見る限り、これは余分なライブラリなしで達成可能です。 私はこれを受け入れる唯一の答えとして、MockMVCでテストするのが難しいようです。 –

+1

なぜ私のソリューションは良くないと思いますか?あなたはHTTPComponentsを必要としません、私はクラスパスでそれを持っていたので、私はそれを使用しました。 urlencode( 'name1')+ '=' + urlencode(value1)+ '&' + ... 'だけであるURLエンコードされたフォームエンティティを構築できるライブラリを使用できます。あなたはそれを構築するための独自のヘルパーメソッドを書くことができました –

+0

mockMVCの実装があってこれがうまくいけば、それはより良いだろうと思っていましたが、回避策は残っています。 面白いJavaをしばらく使っていないと返事があります –

1

あなたクーロン私が作成したこの小さなライブラリを使用してください:https://github.com/f-lopes/spring-mvc-test-utils/

のpom.xmlに依存関係を追加します。

<dependency> 
    <groupId>io.florianlopes</groupId> 
    <artifactId>spring-mvc-test-utils</artifactId> 
    <version>1.0.1</version> 
    <scope>test</scope> 
</dependency> 

はMockMvcでそれを使用します。

mockMvc.perform(MockMvcRequestBuilderUtils.postForm("/users", new AddUserForm("John", "Doe", null, new Address(1, "Street", 5222, "New York")))) 
    .andExpect(MockMvcResultMatchers.status().isFound()) 
    .andExpect(MockMvcResultMatchers.redirectedUrl("/users")) 
    .andExpect(MockMvcResultMatchers.flash().attribute("message", "success")); 

このライブラリは、単にフォームオブジェクトに応じて、MockMvc要求にパラメータを追加します。

ここで私が書いた詳細なチュートリアルです:https://blog.florianlopes.io/tool-for-spring-mockmvcrequestbuilder-forms-tests/

+2

[個人用オープンソースライブラリの提供方法](// meta.stackexchange.com/q/229085)を読んでみてください。 –

関連する問題