3

我正在开发一个需要与远程 HTTP 服务器通信的 Swing 应用程序。该应用程序可能会在代理后面使用。

然后我必须: - 自动检测网络代理(可能在同一网络上有几个) - 让用户手动输入代理配置。

我想编写一个集成测试来验证这些方面,而不必在每台 CI 机器和每台开发者机器上安装代理。我如何看待事物:

  • 集成测试(使用junit)启动一个“嵌入式”代理(@BeforeClass)和一个有点虚拟的http服务器
  • 我的测试(@Test)
    • 测试是否可以自动检测到此代理并打开与我的虚拟 http 服务器的连接并成功从中检索数据
    • 手动设置代理并执行与上面相同的测试

我听说过“littleProxy”组件,但还没有尝试过。

任何人都可以就解决我的问题的最佳方法提供一些建议/帮助/指导吗?

4

1 回答 1

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"));
}

这可以节省任何与防火墙等有关的东西。

为了使这种方法发挥作用,您需要对来自真实服务器的一组记录事务有信心,以便在您的测试中使用。

这种方法可以与运行更全面集成测试的专用机器相辅相成。

于 2012-12-14T15:44:29.237 回答