2015-02-08 61 views
4

一般問題是如何模擬(作爲JUnit測試用例套件的一部分)缺乏網絡連接性,因爲在某些測試用例中這是一個重要的考慮因素。有沒有辦法通過Java API(或通過JVM選項)這樣做,以便某些測試用例可以在網絡分離連接下運行? (模擬還是真實?)。如何模擬單元測試中缺乏網絡連接性

更具體的案例(如果沒有普遍適用的解決方案)是我正在做一堆XML文件處理(包括XSD驗證),並且我需要確保沒有任何內容通過網絡獲取,具體來說,沒有使用xsi:schemaLocation屬性值(提示),並且所有XSD實際上都是從類路徑中獲取的。我使用的Validator自定義LSResourceResolver加載可能需要從類路徑中的任何XSD。

我想我可以實現LSResourceResolverresolveResource方法,以永不返回null(因此,這樣才能永遠依傍打開一個普通的URI連接到資源的默認行爲),但我不知道無論這樣做是否足夠,並且無論如何,如果我可以在模擬孤島模式下運行我的JUnit測試(無需手動降低我的機器上的接口),我會感覺更有信心。

UPDATE

接受的答案,即所提供的-DsocksProxyHost做法正是我所需要的JUnit task可以接受VM參數(如果fork設置爲true)和解決方案,所以我可以在我的螞蟻以下文件:

<junit printsummary="true" showoutput="true" fork="true" maxmemory="256m"> 
    <jvmarg value="-DsocksProxyHost=127.0.0.1"/> 
    ... 

...包裹在裏面contrib:if這樣我就可以在命令行是否將網絡連接或沒有的條件下運行JUnit測試控制。

+2

的作者,如果你會使用一個JVM選項,這會是一個集成測試。爲了進行適當的單元測試,您的網絡連接將成爲您可以模擬的孤立依賴項。這聽起來像你有一個很難依賴Java網絡apis。 – eis 2015-02-08 17:31:05

+0

取決於你的代碼是怎麼回事,但我會嘲笑套接字()調用(請參閱http://stackoverflow.com/questions/3202675/mocking-sockets-in-java-with-mockito討論)或運行在單獨的虛擬機中進行測試(如果這不合適) - 例如,如果您正在使用完全獨立的微服務,這種微服務不會被測試中的代碼嘲笑 – Vorsprung 2015-02-08 17:52:58

回答

2

這不是我建議要做的,但是... 您可以嘗試使用安全管理器。默認情況下,JVM不使用安全管理器,通過設置-Djava.security.manager,您將激活默認安全管理器 。 AFAIR,安全管理器的默認行爲是阻止任何連接(只要權限未在安全策略中明確授予)。但。每次連接將被阻止時,您將收到java.net.NetPermission異常。您也可以遇到本地文件訪問,反射調用等問題。

另一種可能性是將網絡代理設置爲不存在的地址,如-DsocksProxyHost=127.0.0.1。然後任何TCP套接字將嘗試使用SOCKS服務器並失敗。

0

Sniffy允許您在您的JUnit測試中使用block outgoing network connections - 只要您嘗試建立新連接,它就會拋出ConnectException

@Rule public SniffyRule sniffyRule = new SniffyRule(); 

@Test 
@DisableSockets 
public void testDisableSockets() throws IOException { 
    try { 
     new Socket("google.com", 22); 
     fail("Sniffy should have thrown ConnectException"); 
    } catch (ConnectException e) { 
     assertNotNull(e); 
    } 
} 

它還允許您測試應用程序在runtime中的斷開連接的行爲。只需將-javaagent:sniffy.jar=5559添加到您的JVM參數中,並將您的瀏覽器指向localhost:5559 - 它將打開一個網頁,其中包含與下游系統和控件的所有已發現連接以禁用某些連接。

Sniffy connections console

免責聲明:我嗤之以鼻