如何从磁盘读取映射和响应文件

How to read mapping and response files from disk

我将 WireMock 作为单个 WAR 部署到我的服务器。我按照提供的 sample-war project 使我的 WAR 工作。这非常有用,所以感谢这个例子。

我的应用程序唯一的一个问题是 WireMock 从 WAR 内部读取映射和配置文件。 这些文件的路径可通过 web.xml 文件中的 WireMockFileSourceRoot 上下文参数进行配置,但仅当路径指向位于 WAR.[=17= 中的目录时才有效]

我想将映射和响应文件保存在磁盘上的单独文件夹中。

我检查了源代码,正如我所见,WireMock 使用 ServletContextFileSource class 从 servlet 上下文中读取映射文件。 class 扩展 AbstractFileSource.

我找到了一个很好的候选 SingleRootFileSource,它也扩展了相同的抽象 class,在我看来,这个 class 可以从磁盘的任何目录读取映射文件,但是我不知道如何设置 WireMock 以使用此 class 而不是默认值。

你能告诉我正确的方向吗?

首先,您需要将SingleRootFileSource读取的文件转换为StubMappings。例如:

SingleRootFileSource stubsFolder = new SingleRootFileSource("my/path/to/jsons/with/recorded/stubs")
stubsFolder.listFilesRecursively().each { TextFile stubFile ->
StubMapping mapping = StubMapping.buildFrom(stubFile.readContentsAsString());
...

然后您需要在 Wiremock 服务器中注册它们。有几种方法可以完成。 Wiremock 服务器和客户端都可以注册存根。不知道你如何 运行 测试,但如果每个测试用例需要不同的存根,你可能必须使用客户端注册存根(使用 com.github.tomakehurst.wiremock.client.WireMock.stubFor)。如果您决定使用 stubFor,您必须引入将 StubMapping 转换为 MappingBuilder 的简单适配器,因为 stubFor 仅将 MappingBuilder 作为参数。示例适配器:

public class MappingBuilderAdapter implements MappingBuilder {
    StubMapping stubMapping;

    @Override
    public StubMapping build() {
        return this.stubMapping;
    }
    
    ...

在调用 stubFor 之前,客户端必须连接到服务器。签出 configureFor 从 wiremock 客户端连接的方法,如 [使用 Java 客户端配置 WireMock] 中所述:http://wiremock.org/docs/running-standalone/