如何模拟unit testing中缺乏网络连接

一般的问题是如何模拟(作为JUnit测试用例套件的一部分)缺乏网络连接,因为这是一些测试用例中的一个重要考虑因素。 有没有办法通过Java API(或通过JVM选项)这样做,以便某些测试用例可以在网络断开连接下运行? (模拟还是真实?)。

更具体的情况(如果没有普遍适用的解决方案)是我正在做一堆XML文件处理(包括XSDvalidation),我需要确保没有任何东西通过网络获取,具体来说, xsi:schemaLocation属性值(提示)未使用,并且所有XSD实际上都是从类路径获取的。 我正在使用一个带有自定义LSResourceResolver的Validator ,它可以加载类路径中可能需要的任何XSD。

我想我可以实现LSResourceResolverresolveResource方法,以便永远不会返回null (因此,永远不会回到打开与资源的常规URI连接的默认行为),但我不确定是否会无论如何,如果我能在模拟岛模式下运行我的JUnit测试(没有手动关闭我的机器上的接口),我会感到更自信。

UPDATE

接受的答案,即-DsocksProxyHost方法提供了我所需的解决方案,因为JUnit任务可以接受VM参数(如果fork设置为true ),所以我可以在我的Ant文件中包含以下内容:

   ... 

…包含在contrib:if这样,我可以从命令行控制是否在网络连接条件下运行JUnit测试。

这不是我建议做的,但是……你可以尝试使用安全管理器。 默认情况下,JVM不使用安全管理器,通过设置-Djava.security.manager您将激活默认安全管理器。 AFAIR,安全管理器的默认行为是阻止任何连接(只要未在安全策略中明确授予权限)。 但。 每次连接被阻止时,您将获得java.net.NetPermissionexception。 您还可能遇到本地文件访问,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连接控制台

免责声明:我是Sniffy的作者