2014-11-03 62 views
5

在測試中使用MockMVC的URL編碼,我需要測試已經URL編碼的GET網址:春天4.1.1,mockmvc,不想HTTP GET請求

http://host:port/app/controller/[ALREADY URL ENCODED] 

代碼:

mockmvc.perform(get("/controller/[ALREADY URL ENCODED]") 

但是,在日誌中,我看到該URL已被url編碼,然後它纔到達適當的控制器方法。有沒有一種方法可以防止spring mockmvc進行網址編碼?也許在測試中禁用網址編碼?在 「[ALREADY URL編碼]」 字符串

真實的例子:

MEUwQzBBMD8wPTAJBgUrDgMCGgUABBQ%2Fm36Fj2BE19VBYXRO62zrgIYp0gQVAQazEyvlq22wsMBkRyAeaUiZ%2BhTUAgMGJbQ%3D 

這被URL再次編碼控制器看到它之前。

這是從日誌(字符串已經被URL再次編碼)

xxxxx [main] DEBUG [o.s.t.w.s.TestDispatcherServlet] DispatcherServlet with name '' processing GET request for [/app/controller/MEUwQzBBMD8wPTAJBgUrDgMCGgUABBQ%252Fm36Fj2BE19VBYXRO62zrgIYp0gQVAQazEyvlq22wsMBkRyAeaUiZ%252BhTUAgMGJbQ%253D] 

需要注意的是,如果我調用使用curl再有就是通過Spring框架進行任何URL編碼和控制器得到什麼發跨越。然而mockmvc會在它到達適當的控制器方法之前進行編碼。

curl -X GET http:host:port/app/controller/[ALREADY URL ENCODED] 

謝謝。

+0

請舉一個真實的例子。 Spring將只對URL進行必要的編碼。 – 2014-11-03 20:36:32

+0

用已編碼的url字符串的實例編輯 – Khanna111 2014-11-03 20:49:11

+0

現在請發佈您在控制器端收到的內容。你怎麼知道它被重新編碼?第二次編碼哪些字符? – 2014-11-03 20:50:59

回答

3

適合我的是MockMvcRequestBuilders.get(new URI([ENCODED_URL_STRING]))

我想有使用MockMvcRequestBuilders.get(String urlTemplate, Object... urlVariables),用適當的URLVariables是另類,但我還沒有更深。

+1

這工作,並與Spring 4.0.3加入,見bug報告:HTTPS://jira.spring。 IO /瀏覽/ SPR-11441 – jhyot 2016-07-15 07:13:26

1

有點晚,但我創建了自己的URI匹配與MockMvc使用:

public class RequestToUriMatcher implements RequestMatcher { 

    private final String expectedUri; 

    public RequestToUriMatcher(String expectedUri){ 
     this.expectedUri = expectedUri; 
    } 

    @Override 
    public void match(ClientHttpRequest clientHttpRequest) throws IOException, AssertionError { 
     URI requestUri = clientHttpRequest.getURI(); 
     //requestUri is encoded, so if request was made with query parameter already encoded, this would be double-encoded, so decoding it once here 
     String decodedUri = URLDecoder.decode(requestUri.toString(), "UTF-8"); 
     assertTrue(decodedUri.endsWith(expectedUri)); 
    } 
} 

隨之而來的是靜態方法:

public static RequestMatcher requestToUri(String uri){ 
    return new RequestToUriMatcher(uri); 
} 

現在我可以用它像這樣:

String uri = "stuff%3Dvalue"; 
MockRestServiceServer.createServer(restTemplate) 
    .expect(requestToUri(uri))/**/ 

這不是一個完美的解決方案,但爲了缺乏其他解決方案,它的工作原理...

+0

你的回答是對MockRestServiceServer,但問題是關於MockMvc – jhyot 2016-07-15 07:14:35