Как проверить, является ли заголовок ответа mockMvc представлением MD5 части моего ответа? - PullRequest
0 голосов
/ 17 апреля 2019

Мне нужно сравнить MD5-хэш определенного значения в моем теле ответа mockMvc с заголовком того же запроса. Я не уверен, как это сделать, учитывая, что, кажется, нет простого способа получить содержимое сопоставителя jsonPath или xPath. Я думаю, что-то вроде этого - самое близкое, что мне удалось получить. Я вполне уверен, что мне нужно подходить к этому со стороны заголовка, так как MD5 не легко перевернуть.

mockMvc.perform(get(url)
                .session(session)
                .andExpect(header().string(ETAG,  convertToMD5(jsonPath("$.object.id"))));

Есть ли способ сделать это, желательно без написания собственного Matcher?

1 Ответ

0 голосов
/ 19 апреля 2019

После глубокого погружения в код, используемый Spring MockMvc, я обнаружил, что в конечном итоге jsonPath().value(Object) ResultMatcher использует Object.equals () под капотом, и в частности, равно параметру value.Таким образом, я обнаружил, что самый простой способ сделать это - написать класс MD5Wrapper, который инкапсулирует объект String, и определить пользовательский метод equals, который сравнивает инкапсулированную String с хешем MD5 сравниваемого объекта.

public class MD5Wrapper {
    private String mD5Hash;

    public MD5Wrapper(String md5Hash){
        mD5Hash = md5Hash;
    }

    public boolean equals(Object o2){
        if(o2 == null && mD5Hash == null){
            return true;
        }       
        if (o2 == null){
            return false;
        }
        if(mD5Hash == null){
            return false;
        }
        if(!(o2 instanceof String)){
            return false;
        }
        return org.apache.commons.codec.digest.DigestUtils.md5Hex((String)o2).equals(mD5Hash);
    }

    public String getmD5Hash() {
        return mD5Hash;
    }

    public String toString(){
        return mD5Hash;
    }

}

Затем в самом тесте я получил нужный мне заголовок Etag, обернул его и сравнил с моим идентификатором:

ResultActions resultActions = mockMvc.perform(get("/projects/1")
    .session(session)
    .contentType(contentTypeJSON)
    .accept(MediaType.APPLICATION_JSON))
    .... //various accepts
    ;

MvcResult mvcResult = resultActions.andReturn();
String eTAG = mvcResult.getResponse().getHeader(ETAG);
resultActions.andExpect(jsonPath("$.id").value(new MD5Wrapper(eTAG.replace("\"", "")))); //our eTAG header is surrounded in double quotes, which have to be removed.

Так что в итоге я не сталдолжен подходить к нему со стороны заголовка, как я изначально думал, а скорее со стороны jsonPath.

...