gpt4 book ai didi

代理相关代码的Java集成测试

转载 作者:行者123 更新时间:2023-11-30 09:28:45 28 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

我会考虑你是否在测试正确的东西。您不需要测试代理服务器或 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"));
}

这避免了防火墙等问题。

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

这种方法可以通过运行更全面的集成测试的专用机器来补充。

关于代理相关代码的Java集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13877625/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com