【问题标题】:MockRestServiceServer does not verify request properlyMockRestServiceServer 未正确验证请求
【发布时间】:2016-01-26 02:18:24
【问题描述】:

我正在尝试为我的 spring 集成流程编写集成测试。我想用 MockRestServiceServer 记录和匹配输出请求(使用 http:outbound-gateway)到 Rest 服务器。但是,当我调用 mockServer 的 verify 方法时,它并没有像预期的那样进行验证。

我正在按以下方式编写测试:

RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

mockServer.expect(requestTo("adfasfadf.com")).andExpect(method(HttpMethod.GET));

// Call spring integration flow here

mockServer.verify();

当我检查 MockRestServiceServer 的 verify 方法时,它没有调用 RequestMatchers 的 match 方法,我认为这个逻辑有问题。我在这里遗漏了什么吗?

/**
 * Verify that all expected requests set up via
 * {@link #expect(RequestMatcher)} were indeed performed.
 * @throws AssertionError when some expectations were not met
 */
public void verify() {
    if (this.expectedRequests.isEmpty() || this.expectedRequests.equals(this.actualRequests)) {
        return;
    }
    throw new AssertionError(getVerifyMessage());
}

【问题讨论】:

    标签: spring testing integration-testing spring-integration spring-test


    【解决方案1】:

    经过数小时的调试,我意识到MockRestServiceServer 在执行请求期间运行匹配器。所以,如果你有一个围绕请求执行的异常处理程序,你的断言永远不会被正确断言。 此代码来自运行匹配器的RequestMatcherClientHttpRequest

    @Override
    public ClientHttpResponse executeInternal() throws IOException {
        if (this.requestMatchers.isEmpty()) {
            throw new AssertionError("No request expectations to execute");
        }
        if (this.responseCreator == null) {
            throw new AssertionError("No ResponseCreator was set up. Add it after request expectations, "
                    + "e.g. MockRestServiceServer.expect(requestTo(\"/foo\")).andRespond(withSuccess())");
        }
        for (RequestMatcher requestMatcher : this.requestMatchers) {
            requestMatcher.match(this);
        }
        setResponse(this.responseCreator.createResponse(this));
    
        return super.executeInternal();
    }
    

    我认为这应该被视为一个错误,因为我认为断言必须在应用程序执行后执行。

    【讨论】:

    • 嗨。是否有与此行为相关的票证?谢谢。
    【解决方案2】:

    我之前没有使用过MockRestServiceServer,但看起来这是一个很棒的功能。感谢您指出这一点!

    不管怎样,根据它的源代码我们有:

    public static MockRestServiceServer createServer(RestTemplate restTemplate) {
            Assert.notNull(restTemplate, "'restTemplate' must not be null");
            MockRestServiceServer mockServer = new MockRestServiceServer();
            RequestMatcherClientHttpRequestFactory factory = mockServer.new RequestMatcherClientHttpRequestFactory();
            restTemplate.setRequestFactory(factory);
            return mockServer;
        }
    

    请注意RequestMatcherClientHttpRequestFactory

    因此,只有使用修改后的RestTemplate,才能调用您的RequestMatchers

    因此您必须将其注入您的<int-http:outbound-gateway>。 或者甚至更好地在该网关和这个MockRestServiceServer 之间共享RestTemplate 实例。

    【讨论】:

    • 我在 和 MockRestServiceServer 之间使用了相同的休息模板。这是因为请求匹配器在请求执行期间执行,导致集成流捕获创建的断言错误。
    • 这个问题是否有解决方案,或者我只是无法从答案中读取它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2021-08-25
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多