如何检查mockMvc响应头是否是我的响应的一部分的MD5表示?

问题描述 投票:0回答:1

我需要将mockMvc响应主体中特定值的MD5哈希与同一请求的标头进行比较。鉴于似乎没有一种简单的方法来获取jsonPath或xPath匹配器的内容,我不知道如何做到这一点。我认为这样的事情是我能够获得的最接近的事情。我很确定我需要从标题侧接近这个,因为MD5不容易逆转。

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

有没有办法做到这一点,最好不要编写自定义匹配器?

spring md5 mockmvc
1个回答
0
投票

在深入研究Spring MockMvc使用的代码后,我发现最终,jsonPath().value(Object) ResultMatcher使用了引擎盖下的Object.equals(),特别是value参数的等于。因此,我发现最简单的方法是编写一个封装String对象的MD5Wrapper类,并定义一个自定义的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标头,将其包装并将其与我的ID进行比较:

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方面接近它。

© www.soinside.com 2019 - 2024. All rights reserved.