一般问题是如何模拟(作为JUnit
测试用例套件的一部分)缺乏网络连接,因为这是一些测试用例中的一个重要考虑因素。有没有办法通过Java API(或通过JVM选项)这样做,以便某些测试用例可以在网络断开连接下运行? (模拟还是真实?)。
更具体的情况(如果没有普遍适用的解决方案)是我正在做一堆XML文件处理(包括XSD验证),我需要确保不通过网络获取任何内容,特别是不使用xsi:schemaLocation
属性值(提示),并且实际上从类路径获取所有XSD。我正在使用带有自定义Validator的LSResourceResolver来加载类路径中可能需要的任何XSD。
我想我可以实现resolveResource
的{{1}}方法,以便永远不会返回LSResourceResolver
(因此,永远不会回到打开常规的默认行为与资源的URI连接)但我不确定这是否足够,无论如何,如果我能在模拟孤岛模式下运行我的null
测试,我会更有信心(不需要手动关闭接口)我的机器)。
更新
接受的答案,即JUnit
方法提供了我所需的解决方案,因为JUnit task可以接受VM参数(如果-DsocksProxyHost
设置为fork
),那么我可以在我的Ant文件中包含以下内容:
true
...包含在<junit printsummary="true" showoutput="true" fork="true" maxmemory="256m">
<jvmarg value="-DsocksProxyHost=127.0.0.1"/>
...
内,这样我就可以从命令行控制是否在网络连接条件下运行JUnit测试。
答案 0 :(得分:2)
这不是我建议做的,但......
您可以尝试使用安全管理器。默认情况下,JVM不使用安全管理器,通过设置-Djava.security.manager
,您将激活
默认安全管理器。 AFAIR,安全管理器的默认行为是阻止任何连接(只要未在安全策略中明确授予权限)。但。每次连接被阻止时,您将获得java.net.NetPermission
例外。您还可能会遇到本地文件访问,反射调用等问题。
另一种可能性是将网络代理设置为不存在的地址,例如-DsocksProxyHost=127.0.0.1
。然后任何TCP套接字都会尝试使用SOCKS服务器并失败。
答案 1 :(得分: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的作者