WireMock Stub:Curl转JSON生成及文件状态校验需求
WireMock Stub 实现指南
核心需求:匹配PUT上传请求的基础Stub
创建映射文件put-upload-file.json放入WireMock的mappings目录,匹配目标PUT请求的路径、请求头及multipart表单:
{ "request": { "method": "PUT", "url": "/upload/file", "headers": { "accept": { "equalTo": "application/json" }, "authorization": { "equalTo": "sso-auth" }, "Content-Type": { "contains": "multipart/form-data" } }, "multipartPatterns": [ { "name": { "equalTo": "job_file" }, "contentType": { "equalTo": "text/plain" }, "matchingType": "ANY" } ] }, "response": { "status": 200, "headers": { "Content-Type": "application/json" }, "jsonBody": { "status": "success", "message": "File uploaded successfully" }, "transformers": ["file-upload-state-transformer"] } }
次要需求:文件校验与状态管理
要实现提取文件名、校验本地文件存在性并支持后续状态查询,需要结合WireMock自定义扩展与状态存储:
1. 自定义响应转换器(提取文件名+校验本地文件)
创建Java类FileUploadStateTransformer,解析multipart请求获取文件名,校验指定本地路径下的文件是否存在,并将结果存入WireMock全局状态:
import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.common.FileSource; import com.github.tomakehurst.wiremock.extension.Parameters; import com.github.tomakehurst.wiremock.extension.ResponseTransformer; import com.github.tomakehurst.wiremock.http.Request; import com.github.tomakehurst.wiremock.http.Response; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.File; import java.util.List; public class FileUploadStateTransformer extends ResponseTransformer { @Override public Response transform(Request request, Response response, FileSource files, Parameters parameters) { HttpServletRequest servletRequest = new HttpServletRequestWrapper(request.getHttpServletRequest()); if (ServletFileUpload.isMultipartContent(servletRequest)) { try { List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(servletRequest); for (FileItem item : items) { if (item.isFormField()) continue; String fileName = item.getName(); // 替换为你的本地校验路径 File localFile = new File("/your/local/check/path/" + fileName); // 将文件存在状态存入全局状态 WireMock.getGlobalSettings().getState().put("uploaded_file_" + fileName, localFile.exists()); } } catch (Exception e) { e.printStackTrace(); } } return response; } @Override public String getName() { return "file-upload-state-transformer"; } }
2. 状态查询Stub
创建映射文件get-file-status.json,允许通过文件名查询之前存储的状态:
{ "request": { "method": "GET", "urlPattern": "/file/status/([a-zA-Z0-9_\\.]+)" }, "response": { "status": 200, "headers": { "Content-Type": "application/json" }, "jsonBody": { "file_name": "${request.pathSegments.[2]}", "exists": "${state.uploaded_file_${request.pathSegments.[2]}}" }, "transformers": ["response-template"] } }
3. 启动WireMock并加载扩展
编译自定义转换器后,启动WireMock时指定扩展与模板支持:
java -jar wiremock-jre8-standalone.jar --extensions com.your.package.FileUploadStateTransformer --global-response-templates
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

