После глубокого погружения в код, используемый 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.