如何为SpringBoot E2E测试的MockServer添加测试专属Session ID实现隔离
SpringBoot E2E测试中MockServer的测试隔离方案
你的问题核心是测试间MockServer的请求记录互相干扰,解决思路是给每个测试请求打上唯一标识,让MockServer的匹配和验证只针对当前测试的请求。以下是具体实现步骤:
1. 为每个测试生成唯一标识并传递
- 在测试类中,通过
@BeforeEach为每个测试用例生成唯一ID(比如UUID) - 调用业务API时,把这个ID通过请求头、请求体或者URL参数传递给业务服务
- 业务服务在调用MockServer(模拟S3)时,将这个唯一ID同步带到请求中
示例代码(测试类):
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class FileUploadE2ETests { @Autowired private RestTemplate restTemplate; @Autowired private MockServerClient mockServer; private String testUniqueId; @BeforeEach void initTest() { // 生成唯一测试ID testUniqueId = UUID.randomUUID().toString(); // 给RestTemplate添加拦截器,把测试ID带到业务API请求头 restTemplate.getInterceptors().add((request, body, execution) -> { request.getHeaders().add("X-Test-Unique-Id", testUniqueId); return execution.execute(request, body); }); } }
业务服务中调用MockServer的代码(同步测试ID):
// 业务服务里调用MockServer的逻辑 public void saveFileToS3(FileUploadRequest request, HttpHeaders headers) { HttpPost mockS3Request = new HttpPost(mockServerBaseUrl + "/save-file"); // 把测试ID带到MockServer请求头 mockS3Request.setHeader("X-Test-Unique-Id", headers.getFirst("X-Test-Unique-Id")); // 设置请求体... httpClient.execute(mockS3Request); }
2. 基于唯一标识配置Mock和验证规则
- 设置MockServer期望时,除了匹配路径
/save-file,还要加上测试唯一ID的匹配条件 - 验证请求次数时,同样带上这个ID,确保只统计当前测试的请求,不会混入其他测试的记录
示例验证代码:
@Test void verifyNoFailedSaveRequests() { // 执行业务API调用 restTemplate.postForObject("/api/upload", new FileUploadRequest("valid-content"), ResponseEntity.class); // 验证当前测试中,带唯一ID、路径/save-file且请求体含FAILED的请求数为0 mockServer.verify( request() .withPath("/save-file") .withHeader("X-Test-Unique-Id", testUniqueId) .withBody(containing("FAILED")), VerificationTimes.exactly(0) ); } @Test void verifyNormalSaveRequest() { // 执行业务API调用 restTemplate.postForObject("/api/upload", new FileUploadRequest("normal-content"), ResponseEntity.class); // 仅验证当前测试的请求 mockServer.verify( request() .withPath("/save-file") .withHeader("X-Test-Unique-Id", testUniqueId), VerificationTimes.exactly(1) ); }
3. 测试后清理MockServer状态
- 在
@AfterEach中,根据测试唯一ID清理对应的请求记录和期望,避免影响后续测试
@AfterEach void cleanUpMockServer() { // 清除当前测试相关的所有请求记录和期望 mockServer.clear( request() .withHeader("X-Test-Unique-Id", testUniqueId) ); }
如果觉得按ID清理麻烦,也可以直接调用mockServer.reset()清空所有状态,但按ID清理更高效,尤其是测试用例较多时。
内容的提问来源于stack exchange,提问作者Tom Carmi
相关产品推荐
相关产品推荐

