weixin_54912568 2024-08-05 13:47 采纳率: 66.7%
浏览 12
已结题

wireMock设定默认文件问题

如果bodyFilename找不到,系统就会报错,如何实现找不到指定文件,让去找默认的文件

img

  • 写回答

19条回答 默认 最新

  • 才华横溢caozy 2024-08-05 14:26
    关注
    获得0.30元问题酬金

    此答案是由GPT4和本人亲自作答,如有帮助,还请采纳!
    要在WireMock中实现“如果找不到指定文件,则使用默认文件”这一功能,你可以通过自定义请求处理器(Request Processor)来实现。WireMock本身不直接支持这种功能,但是你可以使用Java代码来创建一个自定义的请求处理器来处理这种情况。

    以下是具体的实现思路和代码示例:

    1. 了解WireMock的基本使用

    WireMock是一个用于测试HTTP服务的模拟工具。它允许你定义一组“期望”的请求和对应的响应。通过设置bodyFileName,你可以将响应的主体从文件中读取。

    import com.github.tomakehurst.wiremock.client.WireMockClient;
    import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
    import com.github.tomakehurst.wiremock.server.WireMockServer;
    import static com.github.tomakehurst.wiremock.client.WireMock.*;
    
    public class WireMockExample {
        public static void main(String[] args) {
            WireMockServer wireMockServer = new WireMockServer(WireMockConfiguration.options().port(8080));
            wireMockServer.start();
    
            WireMockClient client = new WireMockClient("localhost", 8080);
    
            client.register(get(urlEqualTo("/some/endpoint"))
                    .willReturn(aResponse()
                            .withStatus(200)
                            .withBodyFile("somefile.json"))); // 使用文件
    
            // 其他配置
        }
    }
    

    在上述代码中,bodyFileName指向somefile.json文件。如果文件不存在,WireMock会返回错误响应。

    2. 实现自定义的请求处理器

    为了实现“如果文件找不到则使用默认文件”的功能,你需要创建一个自定义的ResponseDefinitionTransformer。以下是如何实现这一点的步骤:

    2.1 创建自定义响应处理器

    首先,创建一个类继承自ResponseDefinitionTransformer,并重写必要的方法:

    import com.github.tomakehurst.wiremock.extension.ResponseDefinitionTransformer;
    import com.github.tomakehurst.wiremock.client.WireMockClient;
    import com.github.tomakehurst.wiremock.http.Request;
    import com.github.tomakehurst.wiremock.http.ResponseDefinition;
    import com.github.tomakehurst.wiremock.server.WireMockServer;
    import com.github.tomakehurst.wiremock.stubbing.StubMapping;
    import com.github.tomakehurst.wiremock.common.FileSource;
    import com.github.tomakehurst.wiremock.common.FileSource;
    import com.github.tomakehurst.wiremock.stubbing.StubMapping;
    
    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    
    public class DefaultFileResponseTransformer extends ResponseDefinitionTransformer {
    
        private static final String DEFAULT_FILE = "default_response.json";
    
        @Override
        public String getName() {
            return "default-file-response-transformer";
        }
    
        @Override
        public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, FileSource files) {
            String bodyFileName = responseDefinition.getBodyFileName();
            File file = files.getFileNamed(bodyFileName);
    
            if (file.exists()) {
                try {
                    return ResponseDefinitionBuilder
                            .like(responseDefinition)
                            .withBody(Files.readString(file.toPath()))
                            .build();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            // 文件不存在时使用默认文件
            File defaultFile = files.getFileNamed(DEFAULT_FILE);
            if (defaultFile.exists()) {
                try {
                    return ResponseDefinitionBuilder
                            .like(responseDefinition)
                            .withBody(Files.readString(defaultFile.toPath()))
                            .build();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            // 如果默认文件也不存在,则返回一个默认的错误响应
            return ResponseDefinitionBuilder
                    .like(responseDefinition)
                    .withBody("Default response file not found")
                    .withStatus(500)
                    .build();
        }
    
        @Override
        public boolean applyGlobally() {
            return false;
        }
    }
    

    2.2 注册自定义响应处理器

    在你的主程序中,注册这个处理器:

    import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
    import com.github.tomakehurst.wiremock.server.WireMockServer;
    import static com.github.tomakehurst.wiremock.client.WireMock.*;
    
    public class WireMockExample {
        public static void main(String[] args) {
            WireMockServer wireMockServer = new WireMockServer(
                    WireMockConfiguration.options()
                    .port(8080)
                    .extensions(new DefaultFileResponseTransformer()) // 注册自定义处理器
            );
            wireMockServer.start();
    
            WireMockClient client = new WireMockClient("localhost", 8080);
    
            client.register(get(urlEqualTo("/some/endpoint"))
                    .willReturn(aResponse()
                            .withStatus(200)
                            .withBodyFile("somefile.json"))); // 使用文件
    
            // 其他配置
        }
    }
    

    3. 目录结构和文件

    确保你的WireMock资源目录包含了default_response.json和你可能使用的其他文件。WireMock会从src/test/resources(测试模式)或src/main/resources(生产模式)目录中查找这些文件。

    4. 测试

    启动WireMock服务器并访问相应的URL。测试不同的文件是否能正确返回对应的响应,以及在文件缺失时是否能返回默认响应。

    总结

    上述方法通过自定义ResponseDefinitionTransformer来实现了“如果找不到指定文件,则使用默认文件”的功能。这种方法允许你在WireMock中灵活地处理文件缺失的情况,并提供了一个可靠的备选方案。你可以根据具体需求调整默认文件的路径和响应内容。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月13日
  • 赞助了问题酬金15元 8月5日
  • 创建了问题 8月5日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数