Spring boot 如何使用SpringTestMVC打印请求正文

Spring boot 如何使用SpringTestMVC打印请求正文,spring-boot,spring-test-mvc,Spring Boot,Spring Test Mvc,我正在使用SpringTestMVC测试我的控制器,但是我找不到打印请求正文的方法,这很不方便 使用MockMvcResultHandlers.print() 我找到了一些身体信息,但没有找到身体部位: MockHttpServletRequest: HTTP Method = PUT Request URI = /payment/1234 Parameters = {} Headers = {Content-Type=[application/

我正在使用SpringTestMVC测试我的控制器,但是我找不到打印请求正文的方法,这很不方便

使用MockMvcResultHandlers.print()

我找到了一些身体信息,但没有找到身体部位:

MockHttpServletRequest:
     HTTP Method = PUT
     Request URI = /payment/1234
      Parameters = {}
         Headers = {Content-Type=[application/json]}

         Handler:
            Type = com.restbucks.ordering.rest.PaymentResource
          Method = public org.springframework.hateoas.Resource<com.restbucks.ordering.domain.Payment> com.restbucks.ordering.rest.PaymentResource.handle(com.restbucks.ordering.commands.MakePaymentCommand)

           Async:
   Async started = false
    Async result = null
更新 概念验证代码:

public static class CustomMockMvcResultHandlers {

    public static ResultHandler print() {
        return new ConsolePrintingResultHandler();
    }


    /**
     * Have to copy this class from spring
     */
    private static class ConsolePrintingResultHandler extends PrintingResultHandler {

        public ConsolePrintingResultHandler() {
            super(new ResultValuePrinter() {

                @Override
                public void printHeading(String heading) {
                    System.out.println();
                    System.out.println(String.format("%20s:", heading));
                }

                @Override
                public void printValue(String label, Object value) {
                    if (value != null && value.getClass().isArray()) {
                        value = CollectionUtils.arrayToList(value);
                    }
                    System.out.println(String.format("%20s = %s", label, value));
                }


            });


        }

        @Override
        protected void printRequest(MockHttpServletRequest request) throws Exception {
            super.printRequest(request);
            getPrinter().printValue("Body", getContentAsString(request));
        }

        private String getContentAsString(MockHttpServletRequest request) throws IOException {
            BufferedReader reader = request.getReader();

            StringBuilder builder = new StringBuilder();
            String aux;

            while ((aux = reader.readLine()) != null) {
                builder.append(aux);
            }

            return builder.toString();
        }
    }
}

我相信这将在Spring Framework 5.0 M3中实现:

如果在模拟请求中设置了字符编码,SpringMVC测试中的print()和log()方法现在将打印请求正文

基于


中也提到了您想要请求还是响应?@M.Deinum请求。现在,响应打印已经开箱了。
//PrintingResultHandler.java
protected void printRequest(MockHttpServletRequest request) throws Exception {
    this.printer.printValue("HTTP Method", request.getMethod());
    this.printer.printValue("Request URI", request.getRequestURI());
    this.printer.printValue("Parameters", getParamsMultiValueMap(request));
    this.printer.printValue("Headers", getRequestHeaders(request));
    // add body print?
}
public static class CustomMockMvcResultHandlers {

    public static ResultHandler print() {
        return new ConsolePrintingResultHandler();
    }


    /**
     * Have to copy this class from spring
     */
    private static class ConsolePrintingResultHandler extends PrintingResultHandler {

        public ConsolePrintingResultHandler() {
            super(new ResultValuePrinter() {

                @Override
                public void printHeading(String heading) {
                    System.out.println();
                    System.out.println(String.format("%20s:", heading));
                }

                @Override
                public void printValue(String label, Object value) {
                    if (value != null && value.getClass().isArray()) {
                        value = CollectionUtils.arrayToList(value);
                    }
                    System.out.println(String.format("%20s = %s", label, value));
                }


            });


        }

        @Override
        protected void printRequest(MockHttpServletRequest request) throws Exception {
            super.printRequest(request);
            getPrinter().printValue("Body", getContentAsString(request));
        }

        private String getContentAsString(MockHttpServletRequest request) throws IOException {
            BufferedReader reader = request.getReader();

            StringBuilder builder = new StringBuilder();
            String aux;

            while ((aux = reader.readLine()) != null) {
                builder.append(aux);
            }

            return builder.toString();
        }
    }
}