Testen von Spring asyncResult () und jsonPath () zusammen

Ich verwende eine erholsame URL, um einen Backend-Prozess mit langer Laufzeit zu starten (normalerweise ist dies nach einem Cron-Zeitplan geplant, wir möchten jedoch die Möglichkeit haben, ihn manuell zu starten).

Der folgende Code funktioniert und ich sehe das Ergebnis im Browser, wenn ich manuell teste.

@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);
        }
    };
}

Wenn ich das ohne den testeCallable Ich habe den folgenden Code verwendet und alles funktioniert (ich habe die erwartete Fehlermeldung geändert, um den Beitrag zu vereinfachen).

mockMvc.perform(get("/trigger/job/xyz"))
    .andExpect(status().isOk())
    .andDo(print())
    .andExpect(jsonPath("status").value("SUCCESS"))
    .andExpect(jsonPath("message").value("A meaningful message appears"));

Als ich das hinzufügteCallable es funktioniert jedoch nicht. Ich habe es auch unten versucht, aber es hat nicht funktioniert. Hat sonst noch jemand Erfolg gehabt?

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")));

Unten ist der relevante Teil aus meinem Druck (). Sieht so aus, als ob mockMvc den Json in diesem Fall nicht richtig entwirren kann (obwohl es in meinem Browser funktioniert)? Wenn ich das ohne macheCallable Ich sehe volles 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 = []

Antworten auf die Frage(3)

Ihre Antwort auf die Frage