如何模拟单元测试中缺乏网络连接

时间:2015-02-08 17:28:16

标签: java xml junit xsd-validation

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

更具体的情况(如果没有普遍适用的解决方案)是我正在做一堆XML文件处理(包括XSD验证),我需要确保不通过网络获取任何内容,特别是不使用xsi:schemaLocation属性值(提示),并且实际上从类路径获取所有XSD。我正在使用带有自定义ValidatorLSResourceResolver来加载类路径中可能需要的任何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测试。

2 个答案:

答案 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 connections console

免责声明:我是Sniffy的作者