簡體   English   中英

Spring REST Docs:如何替換參數

[英]Spring REST Docs: how to replace parameters

在我的單元測試中,我們發現

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

比照 Spring REST Docs文檔

這將生成帶有內容的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
----

我能做什么?

由於MockMvc處理請求參數的不幸副作用,模式替換無效。 replacePattern作用於內容(即請求的主體),但是MockMvc實際上不在主體中包括表單編碼的參數。

Spring REST Docs足夠聰明,可以在生成代碼片段時對此進行處理,例如,對於表單URL編碼的POST請求,它會查看參數來確定請求的正文。 在應用replacePattern時,它們不會應用這些相同的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", "user@example.com")
    .param("password", "superSecretPassword"))
  .andExpect(status().isOk())
  .andDo(document("preprocessed-request",
    preprocessRequest(maskPassword())));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM