如何在Cucumber测试类中启动虚拟REST端点以测试回调流程
在Cucumber测试中启动虚拟REST端点处理服务器回调的方案
要在Cucumber测试里搭建可被目标服务器调用的虚拟回调端点,最常用的工具是WireMock——它能快速启动轻量级HTTP服务器,模拟REST接口并记录请求。下面是具体实现步骤:
1. 添加依赖
在项目构建文件中引入WireMock依赖(以Maven为例):
<dependency> <groupId>com.github.tomakehurst</groupId> <artifactId>wiremock-jre8</artifactId> <version>2.35.0</version> <scope>test</scope> </dependency>
2. 用Cucumber Hooks管理WireMock生命周期
创建Hook类,在测试场景前后启动/停止WireMock,确保每个场景环境干净:
import com.github.tomakehurst.wiremock.WireMockServer; import io.cucumber.java.After; import io.cucumber.java.Before; public class WireMockHooks { private static WireMockServer wireMockServer; @Before public void startWireMock() { // 启动WireMock,监听8081端口 wireMockServer = new WireMockServer(8081); wireMockServer.start(); com.github.tomakehurst.wiremock.client.WireMock.configureFor("localhost", 8081); } @After public void stopWireMock() { if (wireMockServer != null) { wireMockServer.stop(); } } }
3. 定义虚拟回调端点的行为
在Step Definitions类中,提前定义回调端点的预期响应逻辑:
import com.github.tomakehurst.wiremock.client.WireMock; import io.cucumber.java.en.Given; public class CallbackStepDefinitions { @Given("一个可接收回调的虚拟端点已准备好") public void setupCallbackEndpoint() { // 模拟POST /callback端点,返回200成功响应 WireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/callback")) .willReturn(WireMock.aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody("{\"status\":\"success\"}"))); } }
4. 构造回调URL并调用服务器API
在测试步骤中,将WireMock的地址作为回调URL传入目标服务器API:
import io.cucumber.java.en.When; import org.springframework.web.client.RestTemplate; public class ServerApiStepDefinitions { private RestTemplate restTemplate = new RestTemplate(); @When("调用服务器的API并传入回调URL") public void callServerApiWithCallback() { // 构造回调URL:WireMock地址 + 端点路径 String callbackUrl = "http://localhost:8081/callback"; // 假设服务器API为POST请求,携带回调URL参数 ServerRequest request = new ServerRequest("test-data", callbackUrl); restTemplate.postForObject("http://target-server:8080/api/trigger", request, String.class); } }
5. 验证服务器是否正确调用回调
在断言步骤中,检查WireMock是否收到预期的回调请求:
import com.github.tomakehurst.wiremock.client.WireMock; import io.cucumber.java.en.Then; public class CallbackVerificationStepDefinitions { @Then("服务器应该成功调用回调端点") public void verifyCallbackWasCalled() { // 验证是否有1次符合条件的POST请求发送到/callback WireMock.verify(1, WireMock.postRequestedFor(WireMock.urlEqualTo("/callback")) .withHeader("Content-Type", WireMock.equalTo("application/json"))); } }
替代方案:使用OkHttp的MockWebServer
如果项目已依赖OkHttp,也可使用MockWebServer实现相同逻辑,核心流程一致:启动临时服务器、定义响应规则、验证请求。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

