访问 tomcat 中部署的 SoapUI 模拟服务中的文件资源

Accessing file resources in SoapUI Mock Service Deployed in tomcat

问题简而言之:SCRIPT Dispatcher 中访问本地 file 关于项目路径,即 def file = new File(groovyUtils.projectPath+"/${responseFileName}.xml").当测试来自 SoapUI Mock Service 时,工作正常。但是当针对 Deployed(remote tomcat) Mock Service 的相同测试 运行 时,为上述语句 (groovyUtils.projectPath) 给出 nothing or empty

Note: Here the responseFileName is present in the same location(when running SoapUI tool), relative to the soapui project xml

有关问题的更多详细信息:

想要在 tomcat 中部署上述模拟服务。因此,使用 Deploy as warSoapUI 创建了 war,这创建了一个 .war 文件。如果 .war 被解压,它会显示以下目录结构。

└───WEB-INF
    ├───actions
    ├───lib
    ├───listeners
    └───soapui

并且 soapui project xml 存在于 WEB-INF/soapui 目录下。

因为 Script 调度程序正在使用 groovyUtils.projectPath,而 .war 文件没有那个 responseFile,在 WEB-INF/soapui 目录下添加了所需的 responseFile 使用7zip 实用程序。并在 tomcat 中成功部署更新的 .war 文件。

测试请求被命中到已部署的模拟服务时,它显示空响应 以及 tomcat 的 catalina.out 中的以下 stacktrace :

17-Jan-2016 10:13:32.356 SEVERE [http-nio-8080-exec-6] com.eviware.soapui.mockaswar.MockAsWarServlet.service null
 com.eviware.soapui.impl.wsdl.mock.DispatchException: Failed to dispatch using script; java.io.FileNotFoundException: \responseFile.xml (The system cannot find the file specified)
        at com.eviware.soapui.impl.wsdl.mock.dispatch.ScriptMockOperationDispatcher.selectMockResponse(ScriptMockOperationDispatcher.java:91)
        at com.eviware.soapui.impl.wsdl.mock.WsdlMockOperation.dispatchRequest(WsdlMockOperation.java:199)
        at com.eviware.soapui.impl.wsdl.mock.WsdlMockDispatcher.dispatchPostRequest(WsdlMockDispatcher.java:218)
        at com.eviware.soapui.impl.wsdl.mock.WsdlMockDispatcher.dispatchRequest(WsdlMockDispatcher.java:113)
        at com.eviware.soapui.impl.wsdl.mock.WsdlMockRunner.dispatchRequest(WsdlMockRunner.java:142)
        at com.eviware.soapui.mockaswar.MockAsWarServlet$MockServletSoapUICore.dispatchRequest(MockAsWarServlet.java:247)
        at com.eviware.soapui.mockaswar.MockAsWarServlet.service(MockAsWarServlet.java:182)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
        at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

顺便说一句,我不确定这样做的方式是否有任何错误。

使用:

SoapUI 开源版 - 5.2.1

Apache Tomcat - 8.0.5

更新: 除上述简短描述外已经尝试过的内容

Script Dispatcher 中只有以下变量(带下划线)可用

并且如果您在 Script Dispatcher 中使用 context,不幸的是 none servlet context[=98= 的常用方法] 工作如下

No signature of method: com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getResourceAsStream() is applicable

No signature of method: com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getRealPath() is applicable

很明显,因为 WsdlMockRunContext 的 SoapUI API 没有可用的 public 方法。

我相信一定有一种不同的方式,我不是 ware 并且希望从社区了解。

主要问题是:groovyUtils.projectPath 仅适用于第一个用例,而 nothing 用于第二个用例.

经过大量试验和错误并在网上搜索后,found a hint在其中一个样本中采用以下方法能够访问本地文件资源均低于问题中提到的用例。

  • 运行 作为来自 soapUI 本身的模拟服务
  • 在远程 tomcat
  • 中部署为 war

所以更改了代码(模拟调度程序的脚本
来自:

   def file = new File(groovyUtils.projectPath+"/${responseFileName}.xml")

至:

   def projectPath = new File(mockOperation.mockService.project.path).parent
   def file = new File(projectPath.+"/${responseFileName}.xml")

Note: file(resource) must be available in the same location where soapui project file is present on the disk i.e., after creatin .war file, update .war file and make sure the required file is placed under WEB-INF/soapui as that where soapui's project xml is available.