- 背景(如并不关心,可以直接跳至最后一项实现代码):
现在这个项目会调用一个远程的webservice叫做NP,但是一直都没有准备好提供给我们用,我们的web application又需要继续开发。于是我们使用了dreamhead所写的moco(https://github.com/dreamhead/moco),为我们模拟远程的NP。Moco做的事情是启动一个服务,监听某已配置端口,接收到一个request后,判断这个请求然后返回相应的response。
Moco提供了两种方式来配置。一种是使用Plugin,通过Json文件配置request和response,运行web application前启动好moco的server,就可以工作了。另一种是内嵌的moco,将moco引入在java代码中启动和配置,这种方式不需要运行项目前启动moco的server。
我们发送的request是xml格式的,期望得到的response也是xml格式的,于是我们定义了许多期望得到的xml文件,配置moco通过判断request返回对应的response。
问题:moco不是引入在webapp的module下面的,而是一个叫service的module,且这些response的xml都放在service这个目录下面的resources目录中。moco有两个方法可以返回两种类型,一个是方法是file,需要参数是路径(相对和绝对都可以);另一个是方法text,需要的参数是string。可以希望能在代码中加载到用于response的xml的文件。
-
项目目录结构:
+---qdem | | | +---qdem-jetty | +---qdem-services | | | | | +---src
| | | |
| | | +---com.qing | | +---resources
| | |
| | ---response1.xml | +---qdem-webapp | +---qdem-tests
- 打包后的项目结构:
Maven在将webapp打包成war包的时候,将qdem-services打成了一个jar包,提供给webapp使用,由于moco是在这个jar包中被使用,所以只列出qdem-services这个jar包的目录结构。
qdem-services.jar | |---resonces1.xml |---+---com.qing
- 加载resource目录下文件的方法:
当在配置Moco的response的时候,使用file方法传入xml的相对路径,即resources下文件的路径,但是单元测试能通过,但在在打完war包后,就找不到response1.xml文件了。所以这个方法是不成功的。
所以我们只有使用text方法,传入response.xml的string。可以使用class的ClassLoader去加载在resources目录下的文件。再将加载的文件转换为string。
我的Moco的配置在类MocoHttpEndPoint
// file("response1.xml"); //does not work
InputStream inputStream = MocoHttpEndPoint.class.getClassLoader().getResourceAsStream("response1.xml"); String value = IOUtils.toString(inputSteam, "UTF-8");
text(value);