如何在Wiremock Servlet上启用响应模板?

时间:2018-05-16 00:41:32

标签: java tomcat servlets wiremock

我在从https://github.com/tomakehurst/wiremock/tree/master/sample-war

实现此项目的servlet上运行Wiremock

我可以将它部署到Tomcat中并且可以正常工作。

现在,我想在此服务器上启用Response Templating,以便我可以使用车把模板调整响应正文。我看到了一些与Junit规则相关的解决方案,directly setting this up from the code以及独立服务器,但找不到解决方案来启用来自servlet的响应模板。

如何从wiremock servlet启用它?

3 个答案:

答案 0 :(得分:1)

我通过扩展和覆盖 WireMockWebContextListener

来将 definitionTransformer 添加到 ServletListener

这将尽可能保留配置库存,并使用Spring功能自动注册新的 Transformers ,而无需进行其他任何配置更改。使用最新的 wiremock 工件 2.26.3

下面是完整的设置配置和实施。

Stopwatch

答案 1 :(得分:0)

如果您想在docker中使用Wiremock,我这里有一个示例docker-compose.yaml,其中包含详细的日志记录和模板。

使用docker-compose up在Docker容器中启动Wiremock。

docker-compose.yaml示例:

version: "3"
services:
 wiremock:
  image: rodolpheche/wiremock:latest
  ports:
    - "8181:8080"
  volumes:
    - ./__files/:/./home/wiremock/__files/
    - ./mappings/:/./home/wiremock/mappings/
  command:
    - -verbose
    - -global-response-templating

docker-compose up(在保存yaml的目录中,并接受文件系统访问请求) 那么你应该准备好了。

Wiremock网址为http://localhost:8181

之后,使用真实数据(http://localhost:8181/__admin/recorder)进行记录

将正文拆分为单独的文件,并将其放置在__files文件夹中。 指向请求文件中的“ bodyFileName”文件(映射)

我在这里有一些建议。 mobileera_wiremock_kb

答案 2 :(得分:0)

好吧,终于找到了答案, 您需要创建扩展ServletContextListener的自定义列表器,然后以编程方式设置响应模板。

public class CustomListener implements ServletContextListener {

private static final String APP_CONTEXT_KEY = "WireMockApp";

@Override
public void contextInitialized(ServletContextEvent sce) {
    ServletContext context = sce.getServletContext();

    boolean verboseLoggingEnabled = Boolean.parseBoolean(
            firstNonNull(context.getInitParameter("verboseLoggingEnabled"), "true"));
    WarConfiguration warConfiguration = new WarConfiguration(context);
    warConfiguration.extensionsOfType(MockTokenTemplate.class);
    final WireMockConfiguration wireMockConfiguration =WireMockConfiguration.wireMockConfig();
    wireMockConfiguration.extensions("com.test.MockTokenTemplate","com.test.MockTokenInqTemplate");
    //wireMockConfiguration.jettySettings();
    wireMockConfiguration.containerThreads(Integer.valueOf(200));
    wireMockConfiguration.disableRequestJournal()
            .containerThreads(Integer.valueOf(200))
            .jettyAcceptors(Integer.valueOf(-1))
            .jettyAcceptQueueSize(Integer.valueOf(1000))
            .jettyHeaderBufferSize(Integer.valueOf(8192));
    String fileSourceRoot = context.getInitParameter("WireMockFileSourceRoot");
 final FileSource fileSource = new ServletContextFileSource(context, fileSourceRoot);
    wireMockConfiguration.fileSource(fileSource);
    //wireMockConfiguration.usingFilesUnderDirectory("/WEB-INF/wiremock/");

    //wireMockConfiguration =(WireMockConfiguration) warConfiguration;
    WireMockApp wireMockApp = new WireMockApp(wireMockConfiguration, new NotImplementedContainer());
    context.setAttribute(APP_CONTEXT_KEY, wireMockApp);
    context.setAttribute(StubRequestHandler.class.getName(), wireMockApp.buildStubRequestHandler());
    context.setAttribute(AdminRequestHandler.class.getName(), wireMockApp.buildAdminRequestHandler());
    context.setAttribute(Notifier.KEY, new Slf4jNotifier(verboseLoggingEnabled));
}

/**
 * @param context Servlet context for parameter reading
 * @return Maximum number of entries or absent
 */
private Optional<Integer> readMaxRequestJournalEntries(ServletContext context) {
    String str = context.getInitParameter("maxRequestJournalEntries");
    if(str == null) {
        return Optional.absent();
    }
    return Optional.of(Integer.parseInt(str));
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
}

}

让我知道在创建自定义响应模板时是否需要帮助。

相关问题