Ну, я нахожу ответ сам ... В принципе, с org.hamcrest.Matcher
невозможно, но мы можем разделить ответ на части и сопоставить их с DTO.
Во-первых, я делаю некоторый статус и основныепроверьте, а затем верните ответ как MvcResult
:
MvcResult result = mockMvc.perform(post("/authorize")
.header(HttpHeaders.AUTHORIZATION, "Basic " + encodeEmailAndPassword("test1@app.com", "1111"))
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(content)
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id_token", Matchers.notNullValue()))
.andReturn();
Затем я создаю несколько DTO для десериализации Джексона: (не забудьте создать класс , а не как внутренний класс, потому что Джексон будетжалуются на то, что «можно использовать только конструктор без аргументов внутреннего нестатического класса»)
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
class TokenResponseDTO implements Serializable {
//@JsonProperty("id_token")
private String idToken;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
class JWTPayloadDTO implements Serializable {
private String aud;
private String sub;
private String nbf;
private String authLevel;
private String iss;
private Long exp;
private Long iat;
private String nonce;
private String jti;
}
Наконец, разбор токена JWT намного проще, чем я думал:
String token = mapper.readValue(result.getResponse().getContentAsString(), TokenResponseDTO.class).getIdToken();
JWSObject jwsObject = JWSObject.parse(token);
JWTPayloadDTO payload = mapper.readValue(jwsObject.getPayload().toString(), JWTPayloadDTO.class);
Assert.assertEquals("random_string", payload.getNonce());
... // other checks