如何测试客户端传入请求并返回响应?Spark+TestNG无法等待请求如何解决
1. 实现测试服务等待传入请求的方案
你当前遇到的测试进程提前退出问题,是因为TestNG的测试方法执行完所有代码逻辑后会自动终止进程,启动的Spark服务也会随之销毁,增加阻塞逻辑阻止测试方法提前退出即可解决,推荐方案如下:
- 用
CountDownLatch实现灵活阻塞,可根据需要接收的请求数量设置闭锁初始值,收到对应数量请求后自动结束阻塞,修改后的示例代码如下:
@Test private void server() throws InterruptedException { // 初始化闭锁,设置为1代表等待1次客户端请求 CountDownLatch latch = new CountDownLatch(1); port(4321); post("/", (req, res) -> { System.out.println(req.body()); // 收到请求后闭锁计数减1 latch.countDown(); return "some_text"; }); // 等待Spark服务初始化完成,避免请求提前进入时服务未就绪 awaitInitialization(); // 阻塞测试线程,直到收到指定数量的请求 latch.await(); // 测试结束后停止Spark服务,避免端口残留占用 stop(); }
- 如果你需要服务持续运行固定时长,也可以把
latch.await()替换为Thread.sleep(自定义时长),手动控制服务的运行时间。
2. Rest-assured能否获取客户端发来的请求
不能。Rest-assured的定位是客户端侧API测试工具,核心能力是构造请求发送到目标服务端,再验证服务返回的响应是否符合预期,本身不具备监听端口、接收外部请求的服务端属性。
你可以将Rest-assured和测试服务端配合使用:测试用例中先启动本地测试服务,再用Rest-assured向该服务发送请求,验证服务的逻辑处理是否符合预期。
3. 专门的测试服务器框架推荐
Java生态有非常多成熟的轻量测试服务器工具,无需手动维护服务生命周期、请求记录逻辑,完全匹配你的测试需求,常用的有两款:
- WireMock:功能最全面的HTTP打桩测试工具,支持自定义任意响应规则,会自动记录所有收到请求的请求头、参数、Body等全量信息,单元测试、集成测试场景都适用。
- MockWebServer:OkHttp官方出品的轻量测试服务器,启动速度极快,适合轻量化单元测试场景,可以主动拉取所有收到的请求记录,配置响应规则的逻辑也非常简单。
内容的提问来源于stack exchange,提问作者bpm2021
相关产品推荐
相关产品推荐

