Korzystam ze spokojnego adresu URL, aby uruchomić długo działający proces backendu (zwykle jest to harmonogram crona, ale chcemy go ręcznie uruchomić).Testowanie Spring asyncResult() i jsonPath() razem
Poniższy kod działa i widzę wynik w przeglądarce podczas testu ręcznego.
@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);
}
};
}
Kiedy przetestować bez Callable
Użyłem poniższy kod i wszystko działa (zmieniłem oczekiwany komunikat o błędzie w celu uproszczenia post).
mockMvc.perform(get("/trigger/job/xyz"))
.andExpect(status().isOk())
.andDo(print())
.andExpect(jsonPath("status").value("SUCCESS"))
.andExpect(jsonPath("message").value("A meaningful message appears"));
Kiedy dodałem Callable
jednak to nie działa. Próbowałem również poniżej, ale to nie zadziałało. Ktoś jeszcze miał sukces?
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")));
Poniżej znajduje się odpowiednia część z mojego wydruku(). Wygląda na to, że mockMvc nie może w tym przypadku poprawnie rozłączyć Json (nawet jeśli działa w mojej przeglądarce)? Kiedy robię to bez Callable
widzę pełny 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 = [email protected]
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 = []
Dobrze byłoby zaznaczyć, że metoda 'instanceOf()' jest częścią biblioteki Hamcrest. Zajęło mi trochę czasu, aby znaleźć to, a następnie umieścić odpowiedni ** maven ** import. Spójrz na ten przykład [mvc showcase] (https://github.com/spring-projects/spring-mvc-showcase/blob/master/src/test/java/org/springframework/samples/mvc/async/CallableControllerTests .java) pomógł. –
Jasne, dobry punkt. Dodany. –
używa całkowicie asyncDispatch()? Wydaje się, że przełamanie enkapsulacji testu - powinno po prostu wiedzieć, jakiego rezultatu oczekiwać, wysyłając GET do/trigger/job/xyz - aby wiedzieć, że implementacja tego kontrolera jest asynchroniczna –