Wiremock - 返回某些媒体文件时全局响应模板导致 500

问题描述 投票:0回答:1

我有一个测试项目,需要启用全局响应模板,因为许多模拟响应包含动态内容。

问题是,我还需要返回某些响应的图像/视频,这似乎与某些图像/视频(但不是全部)的响应模板配合得很好。

看起来好像当它尝试返回视频响应时,它尝试将模板应用于图像文件,并抱怨响应中存在无效字符,至少我认为这个堆栈告诉我的是这样的(这不是' t 显示在wiremock 服务器日志中,它被包装到 HTML 正文中并作为响应返回)。

<tr><th>STATUS:</th><td>500</td></tr>
<tr><th>MESSAGE:</th><td>wiremock.com.google.common.util.concurrent.UncheckedExecutionException: wiremock.com.github.jknack.handlebars.HandlebarsException: inline@1756a128:1:2: found: &apos;?&apos;
{{?-)2?}?/&gt;4?????{?E??????????????????%???z??x???S????2z???{?;??fs??Wn??e?wGwr?????(t+?[??????n??ww}?{&lt;)?U??t??
  ^
</td></tr>
<tr><th>SERVLET:</th><td>com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet-6e20b53a</td></tr>
<tr><th>CAUSED BY:</th><td>wiremock.com.google.common.util.concurrent.UncheckedExecutionException: wiremock.com.github.jknack.handlebars.HandlebarsException: inline@1756a128:1:2: found: &apos;?&apos;
{{?-)2?}?/&gt;4?????{?E??????????????????%???z??x???S????2z???{?;??fs??Wn??e?wGwr?????(t+?[??????n??ww}?{&lt;)?U??t??
  ^
</td></tr>
<tr><th>CAUSED BY:</th><td>wiremock.com.github.jknack.handlebars.HandlebarsException: inline@1756a128:1:2: found: &apos;?&apos;
{{?-)2?}?/&gt;4?????{?E??????????????????%???z??x???S????2z???{?;??fs??Wn??e?wGwr?????(t+?[??????n??ww}?{&lt;)?U??t??
  ^
</td></tr>
</table>
<h3>Caused by:</h3><pre>wiremock.com.google.common.util.concurrent.UncheckedExecutionException: wiremock.com.github.jknack.handlebars.HandlebarsException: inline@1756a128:1:2: found: &apos;?&apos;
{{?-)2?}?/&gt;4?????{?E??????????????????%???z??x???S????2z???{?;??fs??Wn??e?wGwr?????(t+?[??????n??ww}?{&lt;)?U??t??
  ^

    at wiremock.com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2051)
    at wiremock.com.google.common.cache.LocalCache.get(LocalCache.java:3962)
    at wiremock.com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4859)
    at com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer.getTemplate(ResponseTemplateTransformer.java:242)
    at com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer.transform(ResponseTemplateTransformer.java:158)
    at com.github.tomakehurst.wiremock.stubbing.InMemoryStubMappings.applyTransformations(InMemoryStubMappings.java:101)
    at com.github.tomakehurst.wiremock.stubbing.InMemoryStubMappings.serveFor(InMemoryStubMappings.java:80)
    at com.github.tomakehurst.wiremock.core.WireMockApp.serveStubFor(WireMockApp.java:209)
    at com.github.tomakehurst.wiremock.http.StubRequestHandler.handleRequest(StubRequestHandler.java:56)
    at com.github.tomakehurst.wiremock.http.AbstractRequestHandler.handle(AbstractRequestHandler.java:64)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.service(WireMockHandlerDispatchingServlet.java:121)
    at wiremock.javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at wiremock.org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548)
    at wiremock.org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
    at wiremock.org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1435)
    at wiremock.org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
    at wiremock.org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
    at wiremock.org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1350)
    at wiremock.org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at wiremock.org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:735)
    at wiremock.org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
    at wiremock.org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at wiremock.org.eclipse.jetty.server.Server.handle(Server.java:516)
    at wiremock.org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
    at wiremock.org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
    at wiremock.org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
    at wiremock.org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
    at wiremock.org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at wiremock.org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
    at wiremock.org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
    at wiremock.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
    at wiremock.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
    at wiremock.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
    at wiremock.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
    at wiremock.org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:383)
    at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:882)
    at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1036)
    at java.lang.Thread.run(Thread.java:748)
Caused by: wiremock.com.github.jknack.handlebars.HandlebarsException: inline@1756a128:1:2: found: &apos;?&apos;
{{?-)2?}?/&gt;4?????{?E??????????????????%???z??x???S????2z???{?;??fs??Wn??e?wGwr?????(t+?[??????n??ww}?{&lt;)?U??t??
  ^

    at wiremock.com.github.jknack.handlebars.internal.HbsErrorReporter.syntaxError(HbsErrorReporter.java:93)
    at wiremock.com.github.jknack.handlebars.internal.antlr.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
    at wiremock.com.github.jknack.handlebars.internal.HbsParserFactory$2.notifyListeners(HbsParserFactory.java:136)
    at wiremock.com.github.jknack.handlebars.internal.antlr.Lexer.nextToken(Lexer.java:144)
    at wiremock.com.github.jknack.handlebars.internal.antlr.BufferedTokenStream.fetch(BufferedTokenStream.java:169)
    at wiremock.com.github.jknack.handlebars.internal.antlr.BufferedTokenStream.sync(BufferedTokenStream.java:152)
    at wiremock.com.github.jknack.handlebars.internal.antlr.BufferedTokenStream.consume(BufferedTokenStream.java:136)
    at wiremock.com.github.jknack.handlebars.internal.antlr.atn.ParserATNSimulator.execATN(ParserATNSimulator.java:537)
    at wiremock.com.github.jknack.handlebars.internal.antlr.atn.ParserATNSimulator.adaptivePredict(ParserATNSimulator.java:393)
    at wiremock.com.github.jknack.handlebars.internal.HbsParser.body(HbsParser.java:215)
    at wiremock.com.github.jknack.handlebars.internal.HbsParser.template(HbsParser.java:164)
    at wiremock.com.github.jknack.handlebars.internal.HbsParserFactory$1.parse(HbsParserFactory.java:86)
    at wiremock.com.github.jknack.handlebars.cache.NullTemplateCache.get(NullTemplateCache.java:54)
    at wiremock.com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:513)
    at wiremock.com.github.jknack.handlebars.Handlebars.compileInline(Handlebars.java:473)
    at wiremock.com.github.jknack.handlebars.Handlebars.compileInline(Handlebars.java:453)
    at com.github.tomakehurst.wiremock.extension.responsetemplating.HandlebarsOptimizedTemplate.uncheckedCompileTemplate(HandlebarsOptimizedTemplate.java:54)
    at com.github.tomakehurst.wirem
100  9076  100  9076    0     0  55629      0 --:--:-- --:--:-- --:--:-- 55680
ock.extension.responsetemplating.HandlebarsOptimizedTemplate.&lt;init&gt;(HandlebarsOptimizedTemplate.java:49)
    at com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer$3.call(ResponseTemplateTransformer.java:245)
    at com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer$3.call(ResponseTemplateTransformer.java:242)
    at wiremock.com.google.common.cache.LocalCache$LocalManualCache$1.load(LocalCache.java:4864)
    at wiremock.com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
    at wiremock.com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
    at wiremock.com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155)
    at wiremock.com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
    ... 40 more
</pre>

这是我用来上传文件的代码:

byte[] attachmentVideo = FileUtils.loadFileBytes("classpath:payloads/video.mp4");
        response = given().body(attachmentVideo).contentType("video/mp4").put(wiremockUrl() + FILES_ENDPOINT + "video.mp4");
        assertThat(response.getStatusCode(), is(HttpStatus.SC_OK));

这是返回文件的代码:

        wiremock.register(WireMock.get(WireMock.urlMatching(ATTACHMENT_VIDEO_REGEX))
                .willReturn(aResponse().withBodyFile("video.mp4").withHeader("Content-Type", "video/mp4")
                        .withStatus(200).withFixedDelay(VIDEO_RESPONSE_TIME_MS)));

一旦我关闭全局响应模板,视频就会按预期返回。

wiremock
1个回答
0
投票

您唯一的选择是在启动时通过构建中的

.global(false)
切换到本地响应模板,并将
.withTransformers("response-template")
添加到需要它的存根中。

© www.soinside.com 2019 - 2024. All rights reserved.