在使用Java回调时如何测试REST端点?
我想针对使用回调参数的REST端点编写一些测试。听起来可能令人困惑,所以这里有一个解释:
第一个调用是对
/publish
的POST,有效负载为:{"callbackURL":"http://localhost:609/test"}
服务器回复200和一些json
服务器使用一些json有效负载向
http://localhost:609/test/status
(基于提供的回调URL)执行异步POST
我使用TestNG和REST-Assured(非强制)构建了一个测试。我的问题是如何验证在回调URL上接收到的初始回复和消息。
我首先想到的一种(可能很天真的)方法是实现一个HTTP服务器,它在http://localhost:609/test/status
侦听,当有东西到来时,它会写入测试从中读取和验证的同步对象。然而,听起来有点棘手(测试本地服务器将使用内部类,等等)。也很脆弱。有没有人能想到更好的办法?
解决方案
使用Karate。免责声明:我是开发商。
这里有一个关于如何实现这一点的示例(带有源代码链接):https://twitter.com/KarateDSL/status/1417023536082812935
我会试着用简单的方式来解释这个图表。
Test
在测试开始时创建模拟HTTP服务器。这里的端口是动态的,但如果客户端是远程的,您可以很好地将其硬编码为8080。这样客户端就可以调用http://hostname/8080/send
- 注意模拟如何能够与Java类交谈。以及当有东西调用
Mock
时,Test
如何等待Java类发出状态更改的信号。 - 这个特定的演示使用消息队列来连接
Mock
和Java类。但您不需要只响应回调,只需通过调用某个方法来完成CompletableFuture
,而不是您在示例中看到的QueueUtils.send()
- 此处
Test
本身调用Mock
,但在您描述的场景中,您可以很好地调用/publish
,然后等待回调。 - 如果服务器是远程的并且不完全在您的控制之下,您将需要以某种方式告诉它要回调的URL。但在这里的问题中,您似乎可以在
/publish
调用自身中传递URL。 - 如果您的服务器是远程的,并且您不能将您的本地计算机暴露在互联网或同一网络中,您可以轻松地在任何地方运行包裹在Docker容器或云实例(如EC2)中的空手道。请注意,有一些解决方案,如ngrok。
相关文章