简而言之问题:根据项目路径访问 SCRIPT Dispatcher 中的本地file
,即def file = new File(groovyUtils.projectPath+"/${responseFileName}.xml")
。当测试从 SoapUI 作为模拟服务运行时,这正常。但是,当对已部署(远程tomcat)模拟服务运行相同的测试时,为上述语句(nothing or empty
)提供groovyUtils.projectPath
。
注意:此处
responseFileName
存在于相同位置(运行SoapUI工具时),相对于soapui project xml
有关此问题的更多详细信息:
想在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
文件,该文件成功。
当测试请求被点击部署的模拟服务时,它显示空响应和以下堆栈跟踪在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)
如何在SCRIPT
Dispatcher中引用资源文件,以便它以两种方式工作:
一个。在 SoapUI
中使用模拟服务湾在 Tomcat
顺便说一句,我不确定它是否有任何错误。
使用:
SoapUI开源版 - 5.2.1
Apache Tomcat - 8.0.5
更新: 除了上面在简短描述中提到的内容之外已经尝试过的内容
如果你在脚本调度程序中使用context
,遗憾的是 servlet context 的常用方法都没有,例如下面的
没有方法签名:com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getResourceAsStream()适用
没有方法签名:com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext.getRealPath()适用
很明显,因为SoapUI的WsdlMockRunContext API没有这样的公共方法。
我相信必须有一种我不了解并希望从社区中了解的不同方式。
答案 0 :(得分:7)
主要问题是:groovyUtils.projectPath
仅适用于首次使用案例,并且针对第二个用例获取 无 。
经过大量试用后错误并在其中一个示例中搜索网络found a hint以及以下方法,以便能够访问问题中提到的用例以下的本地文件资源。
soapUI
本身因此更改了代码(模拟调度程序的脚本)
的从强>
def file = new File(groovyUtils.projectPath+"/${responseFileName}.xml")
以强>
def projectPath = new File(mockOperation.mockService.project.path).parent def file = new File(projectPath.+"/${responseFileName}.xml")
注意:文件(资源)必须位于同一位置 其中soapui项目文件存在于磁盘上,即在creatin
.war
文件之后,更新.war
文件并确保所需文件位于WEB-INF/soapui
下,其中 soapui&#39 ; s 项目xml可用。