4

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

示例:searchpanel_arrivalairport_th-72f9b8b7-076f-4102-b6a8-aa38710fde1b.json (使用 java 生成形式的wiremock)我期望上面的文件名具有我想要的命名约定,例如

seacrpanel_airport_LGW.json

4

2 回答 2

0

可以通过自定义 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));
        }
于 2021-01-15T19:05:56.003 回答
0

目前没有简单的方法可以做到这一点。然而这是可能的。正如@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 之前就基本设计达成协议。

于 2022-02-10T17:06:04.960 回答