Problem in short : 关于项目路径访问 SCRIPT Dispatcher 中的本地 file
,即 def file = new File(groovyUtils.projectPath+"/${responseFileName}.xml")
. 当测试从SoapUI运行 Mock Service 时,这是 working fine . 但是当针对 Deployed(remote tomcat) Mock Service 运行相同的测试时,为上述语句( groovyUtils.projectPath
)提供 nothing or empty
.
注意:这里的responseFileName存在于相同位置(运行SoapUI工具时),相对于soapui项目xml
More Details about the problem:
想在tomcat中部署上面的模拟服务 . 因此,使用SoapUI中的 Deploy as war 创建了战争,这创建了一个 .war
文件 . 如果 .war
被提取,它将显示以下目录结构 .
└───WEB-INF
├───actions
├───lib
├───listeners
└───soapui
soapui project xml
出现在 WEB-INF/soapui
目录下 .
由于 Script
调度程序正在使用 groovyUtils.projectPath
,并且 .war
文件没有 responseFile
,因此使用7zip实用程序在 WEB-INF/soapui
目录下添加了所需的responseFile . 并在tomcat中部署了更新的 .war
文件,这是成功的 .
当测试请求被命中 deployed mock service 时,它在tomcat的catalina.out中显示 empty response 和以下 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)
- 如何引用
SCRIPT
Dispatcher中的资源文件,以便它以两种方式工作:
一个 . 在SoapUI中的模拟服务
湾在Tomcat中部署了模拟服务
顺便说一句,我不确定它是否有任何错误 .
使用:
SoapUI Open Source Edition - 5.2.1
Apache Tomcat - 8.0.5
Update: 在简短描述中已经尝试过的内容除外
Script Dispatcher
中仅提供以下变量(带下划线)
如果你在 Script Dispatcher 中使用 context
,遗憾的是 servlet context 工作的常用方法如下所示
没有方法签名:com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getResourceAsStream()适用方法无签名:com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getRealPath()适用
很明显,因为SoapUI的WsdlMockRunContext的API没有这样的公共方法 .
我相信必须有一种不同的方式,我不知道并希望从社区中了解到 .
1 回答
主要问题是:
groovyUtils.projectPath
仅适用于第一个用例,而 nothing 适用于第二个用例 .经过大量的试验和错误以及在网上搜索后,其中一个示例和以下方法能够访问本地文件资源以下的问题中提到的用例 .
从
soapUI
本身作为模拟服务运行在远程tomcat中部署为战争
所以更改了代码( script of mock dispatcher )
from:
to: