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 = []

Respuestas a la pregunta(3)

Su respuesta a la pregunta