如何模拟unit testing中缺乏网络连接
一般的问题是如何模拟(作为JUnit
测试用例套件的一部分)缺乏网络连接,因为这是一些测试用例中的一个重要考虑因素。 有没有办法通过Java API(或通过JVM选项)这样做,以便某些测试用例可以在网络断开连接下运行? (模拟还是真实?)。
更具体的情况(如果没有普遍适用的解决方案)是我正在做一堆XML文件处理(包括XSDvalidation),我需要确保没有任何东西通过网络获取,具体来说, xsi:schemaLocation
属性值(提示)未使用,并且所有XSD实际上都是从类路径获取的。 我正在使用一个带有自定义LSResourceResolver的Validator ,它可以加载类路径中可能需要的任何XSD。
我想我可以实现LSResourceResolver
的resolveResource
方法,以便永远不会返回null
(因此,永远不会回到打开与资源的常规URI连接的默认行为),但我不确定是否会无论如何,如果我能在模拟岛模式下运行我的JUnit
测试(没有手动关闭我的机器上的接口),我会感到更自信。
UPDATE
接受的答案,即-DsocksProxyHost
方法提供了我所需的解决方案,因为JUnit任务可以接受VM参数(如果fork
设置为true
),所以我可以在我的Ant文件中包含以下内容:
...
…包含在contrib:if
这样,我可以从命令行控制是否在网络连接条件下运行JUnit测试。
这不是我建议做的,但是……你可以尝试使用安全管理器。 默认情况下,JVM不使用安全管理器,通过设置-Djava.security.manager
您将激活默认安全管理器。 AFAIR,安全管理器的默认行为是阻止任何连接(只要未在安全策略中明确授予权限)。 但。 每次连接被阻止时,您将获得java.net.NetPermission
exception。 您还可能遇到本地文件访问,reflection调用等问题。
另一种可能性是将网络代理设置为不存在的地址,如-DsocksProxyHost=127.0.0.1
。 然后任何TCP套接字将尝试使用SOCKS服务器并失败。
Sniffy允许您在JUnit测试中阻止传出网络连接 – 每当您尝试建立新连接时,它都会抛出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); } }
它还允许您测试应用程序在运行时断开连接时的行为方式。 只需将-javaagent:sniffy.jar=5559
添加到您的JVM参数并将浏览器指向localhost:5559
– 它将打开一个网页,其中包含所有已发现的与下游系统和控件的连接以禁用某些连接。
免责声明:我是Sniffy的作者