2015-10-22 4 views
1

В моих модульных тестов мы находимSpring REST Docs: как заменить Parameters

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 фактически не включает в себя формы, закодированные в теле.

Весенний REST Docs достаточно умен, чтобы справиться с этим, когда он генерирует фрагменты, например. для формы URL, закодированной POST, запрашивает параметры, чтобы выяснить, что должно быть в теле запроса. При применении 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). –

Смежные вопросы