2015-10-22 52 views
1

在我的單元測試,我們發現彈簧安置文檔:如何替換參數

this.mockMvc 
    .perform(post("/authenticate") 
    .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
    .param("username", "[email protected]") 
    .param("password", "superSecretPassword")) 
    .andExpect(status().isOk()) 
    .andDo(document("preprocessed-request", 
    preprocessRequest(replacePattern(Pattern.compile("superSecretPassword"), "XXX")))); 

比照Spring REST Docs documentation

這產生build/generated-snippets/preprocessed-request/http-request.adoc與內容

[source,http] 
---- 
POST /authenticate HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 

username=user%40example.com&password=superSecretPassword 
---- 

但我希望,因爲replacePattern()的被屏蔽的密碼:

[source,http] 
---- 
POST /authenticate HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 

username=user%40example.com&password=XXX 
---- 

我能做些什麼?

回答

2

由於MockMvc處理請求參數的不幸副作用,模式替換不起作用。 replacePattern作用於內容,即請求的主體,但MockMvc實際上並未在表體中包含表單編碼參數。

Spring REST Docs在生成片段時非常聰明,可以處理這個問題,例如,對於編碼爲POST的表單URL,請求它查看參數以確定請求的正文應該是什麼。它在應用replacePattern時不適用同樣的智慧。

您仍然可以使用您自己的OperationPreprocessor來更改參數映射來掩蓋密碼。例如:

private OperationPreprocessor maskPassword() { 
    return new PasswordMaskingPreprocessor(); 
} 

private static class PasswordMaskingPreprocessor implements OperationPreprocessor { 

    @Override 
    public OperationRequest preprocess(OperationRequest request) { 
     Parameters parameters = new Parameters(); 
     parameters.putAll(request.getParameters()); 
     parameters.set("password", "XXX"); 
     return new OperationRequestFactory().create(request.getUri(), 
       request.getMethod(), request.getContent(), request.getHeaders(), 
       parameters, request.getParts()); 
    } 

    @Override 
    public OperationResponse preprocess(OperationResponse response) { 
     return response; 
    } 

} 

然後可以使用這個新的預處理代替replacePattern

this.mockMvc 
    .perform(post("/authenticate") 
    .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
    .param("username", "[email protected]") 
    .param("password", "superSecretPassword")) 
    .andExpect(status().isOk()) 
    .andDo(document("preprocessed-request", 
    preprocessRequest(maskPassword()))); 
+0

我認爲這是非常有用的,我自己寫的'OperationPreprocessor's。是否可以將它添加到[Spring REST Docs文檔](http://docs.spring.io/spring-restdocs/docs/1.0.x/reference/html5/)? –

+0

是的,這是可能的。我已經打開了[問題](https://github.com/spring-projects/spring-restdocs/issues/156)。 –