Groovy 访问tomcat中部署的SoapUI模拟服务中的文件资源
问题简而言之:访问脚本调度程序中的本地Groovy 访问tomcat中部署的SoapUI模拟服务中的文件资源,groovy,mocking,soapui,tomcat8,Groovy,Mocking,Soapui,Tomcat8,问题简而言之:访问脚本调度程序中的本地文件中与项目路径有关的文件,即def file=new file(groovyUtils.projectPath+“/${responseFileName}.xml”)。当测试作为模拟服务从SoapUI运行时,工作正常。但是当对部署的(远程tomcat)模拟服务运行相同的测试时,为上述语句(groovyUtils.projectPath)提供nothing或empty 注意:这里的responseFileName与SoapUI项目xml 有关该问题的更多详细
文件
中与项目路径有关的文件,即def file=new file(groovyUtils.projectPath+“/${responseFileName}.xml”)
。当测试作为模拟服务从SoapUI运行时,工作正常。但是当对部署的(远程tomcat)模拟服务运行相同的测试时,为上述语句(groovyUtils.projectPath
)提供nothing或empty
注意:这里的responseFileName
与SoapUI项目xml
有关该问题的更多详细信息:
def file = new File(groovyUtils.projectPath+"/${responseFileName}.xml")
def projectPath = new File(mockOperation.mockService.project.path).parent
def file = new File(projectPath.+"/${responseFileName}.xml")
希望在tomcat中部署上述模拟服务。因此,使用SoapUI中的部署为war创建了war,这创建了一个.war
文件。如果.war
是extracted,它将显示以下目录结构
└───WEB-INF
├───行动
├───解放党
├───听众
└───索皮
而soapui项目xml
位于WEB-INF/soapui
目录下
由于,Script
调度程序正在使用groovyUtils.projectPath
,并且.war
文件没有该responseFile
,因此使用7zip实用程序在WEB-INF/soapui
目录下添加了所需的responseFile。并在tomcat中部署了更新后的.war
文件,这是成功的
当测试请求被命中到部署的模拟服务时,它将在tomcat的catalina.out中显示空响应和以下堆栈跟踪:
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)
- 如何引用
Dispatcher,使其以两种方式工作: a。SoapUI中的模拟服务 b。在Tomcat中部署模拟服务脚本中的资源文件
上下文
,不幸的是,servlet上下文的常用方法没有一个像下面这样工作
方法com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getResourceAsStream()的签名不适用
方法com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getRealPath()的签名不适用
显然是因为,SoapUI的API没有这样的公共方法可用
我相信一定有一种不同的方式,我不知道,也不想从社区中了解。主要问题是:
groovyUtils.projectPath
只在第一个用例中工作,而在第二个用例中什么也得不到
经过大量的尝试和错误,并在网上搜索,在其中一个样本和以下的方法工作,以能够访问本地文件资源都下面的用例中提到的问题
- 作为模拟服务从
本身运行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") def file=新文件(groovyUtils.projectPath+“/${responseFileName}.xml”) 至: def file = new File(groovyUtils.projectPath+"/${responseFileName}.xml") def projectPath = new File(mockOperation.mockService.project.path).parent def file = new File(projectPath.+"/${responseFileName}.xml") def projectPath=新文件(mockOperation.mockService.project.path).parent def file=新文件(projectPath.+“/${responseFileName}.xml”) 注意:文件(资源)必须位于同一位置 如果磁盘上存在soapui项目文件,即在创建
.war
文件后,更新.war
文件,并确保所需文件与soapui项目xml所在的位置一样放置在WEB-INF/soapui
下
也许您需要从SoapUI中手动访问该响应文件。谢谢@user1207289。尝试过这些,但不幸的是没有帮助。如果在
Script
Dispatch editor顶部看到,您将看到可用的变量context、requestContext、mockOperation、log、mockService
,而context
没有任何此类变量。我不确定之前是否清楚,因此只需重复。我的意思是从部署的WS中访问响应文件。获得tomcatservletContext
,然后访问WEB-INF中的文件,如上述文章所述。祝你好运。嗯,这就是我正在寻找的,并用已经尝试过的内容更新了问题。但模拟是在脚本中完成的,用户对soapUI提供的变量的访问受到限制