Integration Testing Async controller

Viewed 241

I am doing controller integration testing. A controller with a get mapping returns Flux.

@Slf4j
@RequiredArgsConstructor
@RequestMapping("journal")
public class EntryController {

    private final SomeService someService;

    @GetMapping
    public Flux<MyEntity> getEntity(
            @RequestParam(required = false) String documentId,
            @RequestParam(required = false) String docNumber){
 return someService.getEntities( GetEntriesRequest.builder()
                         .documentId(documentId)
                         .docNumber(docNumber).build;
    }
    @PostMapping
    public MyEntity postNew(@RequestBody @Valid MyEntity entity) {
        return someService.save(entity);
    }

}
            .

Initially, I tried to test it like this. (method asJson remakes the Entity created by creatingEntity method in a Json format). I'm already tested a controller with a post mapping and it works right.

    @Test
    void getEntriesByDocumentNumber() throws Exception {
        MvcResult mvcResult  = this.mockMvc.perform(post("/journal")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(asJson(creatingEntity())))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(status().isOk())
                .andReturn();
        String response = mvcResult.getResponse().getContentAsString();
        String documentIdFromResponse = 
       JsonPath.parse(response).read("$.documentId");

        this.mockMvc.perform(get("/journal")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .param("documentId", documentIdFromResponse))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(status().isOk());

I do not know how to process the response that I receive. The fact is that the response body is empty, but the method works, this can be seen in the async result. I did not find how to get the asinc result. And I can’t use JsonPath, because the body is empty.

      HTTP Method = GET
      Request URI = /journal
       Parameters = {documentId=[1590067372983-9ce4f563-520d-42ff-bd31-5b78befaf4b1]}
          Headers = [Content-Type:"application/json;charset=UTF-8", Accept:"application/json"]
             Body = null
    Session Attrs = {}

Async:
    Async started = true
     Async result = [MyEntity(documentId=1590067372983-9ce4f563-520d-42ff-bd31-5b78befaf4b1, documentNumber=100)]

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = [] 

I try to use WebTestClient, But this code does not work. It's falling with No bean named 'webHandler' available

@SpringBootTest
@AutoConfigureMockMvc
class ApplicationTests {
@Autowired
    private MockMvc mockMvc;

    WebTestClient webTestClient;

    @BeforeEach
    void setUp(ApplicationContext context) {
        webTestClient = WebTestClient.bindToApplicationContext(context).build();
    }
    @Test
    void getEntityTest() throws Exception {
        MvcResult mvcResult  = this.mockMvc.perform(post("/journal")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(asJson(creatingEntity())))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(status().isOk())
                .andReturn();
        String response = mvcResult.getResponse().getContentAsString();
        String documentIdFromResponse = JsonPath.parse(response).read("$.documentId");

        webTestClient.get()
                .uri("journal/")
                .accept(MediaType.APPLICATION_JSON)
                .exchange()
                .expectStatus().isOk()
                .expectBody()
                .jsonPath("$[0].documentId").isEqualTo(documentIdFromResponse);
    }
}

I'm already find this. But I don't know how to use it

@Bean
    public WebHandler webHandler() {
        //implement your bean initialization here
    }
0 Answers
Related