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



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

问题是,我还需要为一些响应返回图像/视频,而这似乎与为一些图像/视频(但不是全部(创建响应模板不太好。

当它试图返回视频响应时,它似乎试图将模板应用于图像文件,并抱怨响应中存在无效字符,至少我认为这个堆栈是在告诉我(这没有显示在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)));

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

这里唯一的选择是在启动时通过构建中的.global(false)切换到本地响应模板,并将.withTransformers("response-template")添加到需要它的存根中。

最新更新