Search code examples
javaspringunit-testingmockingmockrestserviceserver

Is there a ready-made class to capture request body in MockRestServiceServer for logging etc.?


I will answer my question myself, but I am not happy with my solution, so if there is a ready-made convenience class/method doing the same, let me know.

Problem statement

I am using Spring MockRestServiceServer in unit tests to mock a REST service call. I'd like to have quick access to the request body which comes to the mock REST server. Typically for logging or just for evaluating during the debugging.

The context for usage is as follows:

import org.springframework.test.web.client.MockRestServiceServer;

class MyTest {
    @Test
    void myTest() {
        MockRestServiceServer mockServer = ...;
        mockServer
            .expect(MockRestRequestMatchers.method(HttpMethod.POST))
            .andExpect(MockRestRequestMatchers.requestTo("http://mock.example.com/myservice"))

            // The following method does not exist, it's what I'd like to have
            .andCapture(body -> { 
                /* do something with the body */ 
                log.info(body);
            }) // the place for the Captor

            .andRespond(MockRestResponseCreators.withSuccess("The mock response", MediaType.TEXT_PLAIN))
        ;
    }
}

Question

Is there a ready-made class/method which would provide this "andCapture(body -> {})" functionality out of the box?


Solution

  • The best solution I have so far is this:

    .andExpect(request -> {
        final String body = ((ByteArrayOutputStream) request.getBody()).toString(StandardCharsets.UTF_8);
        /* do something with the body */
        log.info(body);
    })
    

    However, I'd expect that there might exist a convenience method for capturing directly the request body.