2013-03-09 49 views
5

我寫一個JERSEY項目單元測試JERSEY控制器方法。如何測試與UriInfo

對於沒有查詢字符串的方法,我可以實例化控制器並調用方法。

路徑中的說法也工作,因爲他們顯示爲方法的字符串參數。

但是當我查詢字符串的模式有一個特殊的參數(@Context UriInfo url)

如何建立在我的單元測試的UriInfo說法? 爲什麼這個類沒有構造函數?

+2

其高度不尋常的測試容器外的新澤西州的資源,和那種適得其反。不行的事情?集裝箱注入資源,路徑解釋,參數提取,子資源定位器......這個列表繼續。如果您真的想測試您的JAX-RS資源類,您應該從***客戶端***端進行測試。 – Perception 2013-03-09 13:02:36

+0

我也可以在一個tomcat容器中運行一些測試,但是在運行代碼覆蓋率分析的調試單元測試方面。我完全失明,因爲它們分成兩個獨立的過程。 – 2013-03-09 14:23:30

+0

如果您用您的應用程序獨立的Tomcat的部署,您可以運行的反對JUnit測試是使用客戶端庫來測試資源西裝。您可以使用Jersey客戶端庫甚至Apache HttpComponents來創建這些測試。 – Perception 2013-03-09 14:26:32

回答

2

UriInfo是一個接口,所以你不能直接創建它的對象。你需要繼承它並創建你自己的UriInfo類。所以你的uriinfo類應該將String uri/url轉換爲UriInfo對象。

public class UriInformation implements UriInfo { 
    MultivaluedMap<String, String> pathParamMap; 
    MultivaluedMap<String, String> queryParamMap; 
    public UriInformation(UriInfo uriInfo) { 
     //parse uriInfo 
    } 
//setters/getters 
} 

所以這樣你可以單元測試你的資源,而不用在tomcat/server中運行它。

6

如果你在測試中使用的Mockito,你可以模擬出UriInfo代替:

import java.net.URI; 
import javax.ws.rs.core.UriInfo; 

UriInfo mockUriInfo = mock(UriInfo.class); 
when(mockUriInfo.getRequestUri()).thenReturn(new URI("http://www.test.com/go")); 
+0

你在這裏使用了哪個URI類? – k4sia 2015-04-20 14:39:34

+1

我剛剛檢查並添加了上面的導入....這是在Java 7 .... – 2015-04-20 15:25:34