我會考慮你是否正在測試正確的事情。您不需要測試代理服務器或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等。
爲了使這種方法起作用,您希望對來自真實服務器的一組記錄事務有信心以用於測試。
這種方法可以補充一個運行更全面的集成測試的專用機器。
關於第二個想法,在讀完McDowell的回答後,我終於採取了模擬方法! –