我正在使用Citrus framework对几个微服务进行集成测试。测试设置大致如下:
我不知道如何进行设置,以使测试不容易受到比赛条件的影响。我已经尝试过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的调用?
答案 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作为值。