如何处理对Citrus服务器上不同URL的并行请求?

时间:2019-03-29 13:36:51

标签: concurrency mocking citrus-framework

我正在使用Citrus framework对几个微服务进行集成测试。测试设置大致如下:

  1. 从Citrus HTTP客户端发送请求到其中一个微服务
  2. 多个微服务同时向同一远程主机(我要使用Citrus HTTP服务器模拟)发送请求,并在该远程主机上调用不同的URL(例如“ http://server.com/A/”和“ http://server.com/Z/E/F/” ”或具有不同查询参数(例如“ http://server.com/A?param=1”和“ http://server.com/A?param=great”)的同一个网址
  3. Citrus服务器应返回根据其响应的特定URL调用动态计算得出的不同响应
  4. 所有后续验证步骤均不需要与Citrus服务器进行交互。

我不知道如何进行设置,以使测试不容易受到比赛条件的影响。我已经尝试过this github thread中建议的解决方案的各种变化,但我不知道如何根据自己的用例进行调整。我试图将不同的请求-响应对放入单独的async()-容器中,但是最终在错误的竞争条件下切换了响应,并且我的测试经常失败。我试着像这样模拟每个请求-响应对:

private void serverReceiveCallAndRespond(String path, Resource response) {
    async().actions(
        http().server(citrusHttpServer)
            .receive()
            .get(path),
        http().server(citrusHttpServer)
            .send()
            .response(HttpStatus.OK)
            .contentType("application/json")
            .messageType(JSON)
            .payload(response)
    );
}

TLDR:如何告诉Citrus服务器以不同的响应异步响应对不同URL的调用?

1 个答案:

答案 0 :(得分:0)

我建议使用message selectors解决此问题。 Citrus服务器将所有传入请求推送到内部消息通道。您可以使用消息选择器从该渠道中明确选择一条消息。

http().server(citrusHttpServer)
            .receive()
            .get(path)
            .selector(Collections.singletonMap(HttpMessageHeader.HTTP_REQUEST_URI, "/Z/E/F/"))

通过这种方式,您始终可以在测试中首先在/Z/E/F/上收到请求,并以适当的响应进行响应。之后,您可以使用另一个选择器添加第二个接收,并对该呼叫提供适当的响应。

然后,传入请求的顺序不再受限于竞赛条件。

尽管不确定HttpMessageHeader.HTTP_REQUEST_URI标头。您可能需要在此处使用完整的请求URI作为值。