2012-12-14 70 views
2

我正在開發一個Swing應用程序,需要與遠處的HTTP服務器進行通信。該應用程序可能潛在地在代理之後使用。Java集成測試代理相關代碼

我必須然後: - 自動檢測網絡代理(可能在同一網絡上的幾個) - 讓用戶手動輸入代理配置。

我想編寫一個集成測試來驗證各個方面,而不必在每臺CI機器和每臺開發機器上安裝代理。 如何我看到的東西:

  • 集成測試(使用JUnit)啓動 「嵌入式」 代理(@BeforeClass)和一個有點啞http服務器
  • 我的測試(@測試)
    • 試驗表明,該代理可以被自動檢測到,然後打開到我的虛設的http服務器的連接,併成功地從它
    • 手動設置代理檢索DATAS並執行相同的測試如上

我聽說過「littleProxy」組件,但沒有嘗試過。

任何人都可以提供一些關於解決我的問題的最佳方法的建議/幫助/指導?

+0

關於第二個想法,在讀完McDowell的回答後,我終於採取了模擬方法! –

回答

2

我會考慮你是否正在測試正確的事情。您不需要測試代理服務器或Java的網絡類。

考慮這個工具類型,從URL中讀取數據:

public final class Network { 
    public interface UrlOpener { 
     public InputStream open(URL url) throws IOException; 
    } 

    private static UrlOpener urlOpener = new UrlOpener() { 
     public InputStream open(URL url) throws IOException { 
      return url.openStream(); 
     } 
    }; 

    public static InputStream openUrl(URL url) throws IOException { 
     return urlOpener.open(url); 
    } 

    public static void setUrlOpener(UrlOpener urlOpener) { 
     Network.urlOpener = urlOpener; 
    } 
} 

這可以作爲你的代碼和Java的網絡之間的抽象層I/O:

public class SomeType { 
    public void processData(URL url) throws IOException { 
     InputStream input = Network.openUrl(url); 
     // process the data 
    } 
} 

你的測試使用這一層模擬出的數據:

@Before public void setup() throws IOException { 
    final URL mockUrl = this.getClass().getResource("/foo/bar.txt"); 
    Network.UrlOpener opener = Mockito.mock(Network.UrlOpener.class); 
    Answer<InputStream> substituteUrl = new Answer<InputStream>() { 
     public InputStream answer(InvocationOnMock invocation) throws Throwable { 
      return mockUrl.openStream(); 
     } 
    }; 
    Mockito.when(opener.open(Mockito.any(URL.class))).then(substituteUrl); 
    Network.setUrlOpener(opener); 
} 

@Test public void testSomething() throws IOException { 
    SomeType something = new SomeType(); 
    something.processData(new URL("http://example.com")); 
} 

這樣可以節省防火牆s等。

爲了使這種方法起作用,您希望對來自真實服務器的一組記錄事務有信心以用於測試。

這種方法可以補充一個運行更全面的集成測試的專用機器。

+0

你是對的:爲什麼測試java代理相關的類? ;) 感謝您的示例代碼! –