- 背景(如並不關心,可以直接跳至最后一項實現代碼):
現在這個項目會調用一個遠程的webservice叫做NP,但是一直都沒有准備好提供給我們用,我們的web application又需要繼續開發。於是我們使用了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);
IOUtils是commons-io包的方法,在maven中,添加了如下依賴:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>