【问题标题】:Is there a ready-made class to capture request body in MockRestServiceServer for logging etc.?是否有现成的类来捕获 MockRestServiceServer 中的请求主体以进行日志记录等?
【发布时间】:2021-06-07 12:14:06
【问题描述】:

我会自己回答我的问题,但我对我的解决方案不满意,所以如果有现成的便利类/方法可以这样做,请告诉我。

问题陈述

我在单元测试中使用 Spring MockRestServiceServer 来模拟 REST 服务调用。我想快速访问模拟 REST 服务器的请求正文。通常用于记录或仅用于在调试期间进行评估。

使用上下文如下:

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

问题

是否有现成的类/方法可以提供开箱即用的“andCapture(body -> {})”功能?

【问题讨论】:

    标签: java spring unit-testing mocking mockrestserviceserver


    【解决方案1】:

    到目前为止我最好的解决方案是:

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

    但是,我希望可能存在一种直接捕获请求正文的便捷方法。

    【讨论】:

    • 用 StringBuilder 来捕捉身体,这可以作为 ArgumentCaptor 模式的解决方法!
    • @gigi2 你能详细说明你的想法吗?
    • 哦,我只是想说一个StringBuilder可以在范围之外使用,然后将最终的字符串附加到StringBuilder。因此它无处不在。感谢您提供解决方案。它对我很有效
    • @gigi2 哦,您的意思是使用StringBuilder 作为String 值的包装器来克服“外部范围变量必须有效地最终限制”,以防万一您想在mockServer 处理链之后使用值?我通常使用AtomicReferenceOptional 如果非常需要 需要它,但它通常被认为是反模式并且不太推荐:) 我最近参与了很多反应式编程,当 lambda 代码在很久以后在不同的线程中执行时,所以我通常不赞成这种解决方案。即使在这里它会工作,
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2013-04-04
    • 2014-03-09
    • 2013-12-13
    • 1970-01-01
    • 2021-01-09
    • 2014-08-25
    相关资源
    最近更新 更多