Probando Spring asyncResult () y jsonPath () juntos
Estoy usando una url tranquila para iniciar un proceso de back-end de larga duración (normalmente está en un cron cron, pero queremos la posibilidad de hacerlo manualmente).
El siguiente código funciona y veo el resultado en el navegador cuando lo pruebo manualmente.
@ResponseBody
@RequestMapping(value = "/trigger/{jobName}", method = RequestMethod.GET)
public Callable<TriggerResult> triggerJob(@PathVariable final String jobName) {
return new Callable<TriggerResult>() {
@Override
public TriggerResult call() throws Exception {
// Code goes here to locate relevant job and kick it off, waiting for result
String message = <result from my job>;
return new TriggerResult(SUCCESS, message);
}
};
}
Cuando pruebo esto sin elCallable
Usé el siguiente código y todo funciona (cambié el mensaje de error esperado para simplificar la publicación).
mockMvc.perform(get("/trigger/job/xyz"))
.andExpect(status().isOk())
.andDo(print())
.andExpect(jsonPath("status").value("SUCCESS"))
.andExpect(jsonPath("message").value("A meaningful message appears"));
Cuando agregué elCallable
Sin embargo, no funciona. También probé a continuación, pero no funcionó. ¿Alguien más tuvo éxito?
mockMvc.perform(get("/trigger/job/xyz"))
.andExpect(status().isOk())
.andDo(print())
.andExpect(request().asyncResult(jsonPath("status").value("SUCCESS")))
.andExpect(request().asyncResult(jsonPath("message").value("A meaningful message appears")));
A continuación se muestra la parte relevante de mi impresión (). Parece que mockMvc no puede desenredar el Json correctamente en este caso (aunque funciona en mi navegador). Cuando hago esto sinCallable
Veo completo a JSON.
MockHttpServletRequest:
HTTP Method = GET
Request URI = /trigger/job/xyz
Parameters = {}
Headers = {}
Handler:
Type = foo.bar.web.controller.TriggerJobController
Method = public java.util.concurrent.Callable<foo.bar.myproject.web.model.TriggerResult> foo.bar.myproject.web.controller.TriggerJobController.triggerJob(java.lang.String)
Async:
Was async started = true
Async result = foo.bar.myproject.web.model.TriggerResult@67aa1e71
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
MockHttpServletResponse:
Status = 200
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []