我们可以在 Wiremock 中自定义映射文件名吗?



我正在使用JAVA DSL通过Wiremock记录应用程序,我们可以选择自定义映射文件名吗? 而不是获取从 wiremock 生成的文件名。

示例:searchpanel_arrivalairport_th-72f9b8b7-076f-4102-b6a8-aa38710fde1b.json (使用 java 生成表单 wiremock( 我期待上面的文件名和我想要的命名约定,例如

seacrpanel_airport_LGW.json

目前没有简单的方法可以做到这一点。然而,这是可能的。正如@santhiya-ps所说,你需要编写自己的RequestListener实现,可能使用StubMappingJsonRecorder作为模板。

您无法扩展它并覆盖writeToMappingAndBodyFile因为该方法是私有的,但这是您可能想要更改的方法。

import com.github.tomakehurst.wiremock.common.*;
import com.github.tomakehurst.wiremock.core.*;
import com.github.tomakehurst.wiremock.http.*;
import java.util.List;
import static com.github.tomakehurst.wiremock.core.WireMockApp.*;
class NameTemplateStubMappingJsonRecorder implements RequestListener {
private final FileSource mappingsFileSource;
private final FileSource filesFileSource;
private final Admin admin;
private final List<CaseInsensitiveKey> headersToMatch;
private final IdGenerator idGenerator = new VeryShortIdGenerator();
public NameTemplateStubMappingJsonRecorder(Admin admin) {
this.mappingsFileSource = admin.getOptions().filesRoot().child(MAPPINGS_ROOT);
this.filesFileSource = admin.getOptions().filesRoot().child(FILES_ROOT);
this.admin = admin;
this.headersToMatch = admin.getOptions().matchingHeaders();
}
@Override
public void requestReceived(Request request, Response response) {
// TODO copy StubMappingJsonRecorder changing as required...
}
}

然后,您可以按以下方式注册您的RequestListener

WireMockServer wireMockServer = new WireMockServer();
wireMockServer.addMockServiceRequestListener(
new NameTemplateStubMappingJsonRecorder(wireMockServer)
);
wireMockServer.start();

只要您仍然将映射文件存储在预期的目录中(存储在上面的FileSource mappingsFileSource中,该目录将${rootDir}/mappings,其中rootDir按照配置 - 文件位置中所述进行配置(,它们应该会成功加载,因为该目录中扩展名json的所有文件都将作为映射加载。

如果StubMappingJsonRecorder采取生成这些名称的策略,那会容易得多 - 可能值得在 WireMock 存储库上创建一个问题,要求一种更简单的方法来做到这一点。不过,我建议在提出 PR 之前就基本设计达成一致。

自定义文件名可以通过自定义 StubMappingJsonRecorder 来添加。

我添加了 CustomStubMappingJsonRecorder 并覆盖 writeToMappingAndBodyFile 方法。

if(fileName!=null && !fileName.equals("")){
mappingFileName=fileName+"-mapping.json";
bodyFileName=fileName+"-body.json";
}else {
mappingFileName = UniqueFilenameGenerator.generate(request.getUrl(), 
"mapping", filed);
bodyFileName = UniqueFilenameGenerator.generate(request.getUrl(), "body", 
fileId, ContentTypes.determineFileExtension(request.getUrl(), 
response.getHeaders().getContentTypeHeader(), body));
}

最新更新