Spring MockRestServiceServer未正确验证请求

Spring MockRestServiceServer未正确验证请求,spring,testing,integration-testing,spring-integration,spring-test,Spring,Testing,Integration Testing,Spring Integration,Spring Test,我正试图为我的spring集成流编写一个集成测试。我想用 MockRestServiceServer记录传出请求并将其与Rest服务器匹配(使用http:outbound gateway)。然而,当我调用mockServer的verify方法时,它并不像预期的那个样进行验证 我以以下方式编写测试: RestTemplate restTemplate = new RestTemplate(); MockRestServiceServer mockServer = MockRestServiceSe

我正试图为我的spring集成流编写一个集成测试。我想用 MockRestServiceServer记录传出请求并将其与Rest服务器匹配(使用http:outbound gateway)。然而,当我调用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());
}

我以前没有使用过
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;
    }
请注意
requestmatcherclientprequestfactory

因此,只有在使用修改后的
restemplate
时才能调用
RequestMatchers

因此,您必须将其注入您的

或者更好地在网关和这个
MockRestServiceServer
之间共享
restemplate
实例。经过数小时的调试,我意识到
MockRestServiceServer
在请求执行期间运行匹配程序。因此,如果在请求执行过程中有一个异常处理程序,那么您的断言将永远不会被正确断言。 此代码来自运行匹配器的
requestmatcherclienttprequest

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

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

我在和MockRestServiceServer之间使用相同的rest模板。这是因为请求匹配器是在请求执行期间执行的,这导致集成流捕获创建的断言错误。是否有解决问题的方法,或者我只是无法从答案中读取它?您好。是否有与此行为相关的罚单?谢谢