4

我正在为我的spring集成流写一个集成测试。我想使用 MockRestServiceServer来记录和匹配传出的请求(使用http:outbound-gateway)到Rest服务器。但是,当我调用mockServer的验证方法时,它不会按照预期进行验证。MockRestServiceServer没有正确验证请求

我写我的测试以下列方式:

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的验证方法,它不叫RequestMatchers的匹配方法,我相信有什么不对的逻辑。我在这里错过了什么吗?

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

回答

0

我以前没有用过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实例。

+0

我在和MockRestServiceServer之间使用了相同的休息模板。这是因为请求匹配器在请求执行期间执行,这导致整合流程捕获创建的断言错误。 – kosker

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

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