2013-08-28 2 views
9

I署名スプリングMockMVCないときメソッドシグネチャにmockHttpServletRequestを注入

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
public ModelAndView upload(HttpServletRequest request, HttpServletResponse response) { 

    String remoteAddress = request.getRemotedAddr(); 
    auditService.logAddress(remoteAddress); 

    // do work... 

    return mav; 
} 

と一部スプリングMVCコントローラ・コードを継承していると私は私が必要試験

public void someTest() { 
    mockMvc().perform(fileUpload("/upload").file(FileFactory.stringContent("myFile"))); 

    // do work... 
    verify(auditService.logAddress("123456")); 
} 

を行う春MockMvc試験を持って考えるとアップロードコントローラメソッドに渡されるHttpServletRequestオブジェクトのリモートアドレスを "12345"に設定すると、テストでauditServiceの呼び出しを確認できます。

私はsetRemoteAddrをMockHttpServletRequestオブジェクトを作成して呼び出すことができます()メソッドが、mockMvc()メソッドの呼び出しに、このモックリクエストオブジェクトを渡す方法?

答えて

17

RequestPostProcessorを追加できます。次に、with()メソッドを使用してmockmvcに渡すことができます。

mockMvc().perform(
    fileUpload("/upload") 
    .file(FileFactory.stringContent("myFile")) 
    .with(new RequestPostProcessor() { 
    public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { 
     request.setRemoteAddr("12345"); 
     return request; 
    }})); 

何かがうまくいくはずです。

+0

私はこれを試しましたが、request.getRemoteAddr()は127.0.0.1を返します。これはデフォルトの動作だと思います。 : –

+0

'setRemoteAddr'が呼び出されていない場合は、あなたの解決策/設定/テストコードに何か問題があるはずです... –

+1

確かにうまくいきます。今はJava 8ラムダを使用しています。 – objectuser