我想知道是否有办法告诉JVM它无法连接到某个Java程序的任何Web资源,或者在执行此操作时立即失败,即做一个相当于关闭Internet的软件使用硬件开关进行访问。 这是为了协助自动测试,禁用系统的防火墙对我来说是没有选择的。
背景 我目前正在研究一个Java问题,其中XML身份转换不能与XML中引用的DOCTYPE一起使用,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px"
height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<!-- content.... -->
</svg>
DocumentBuilderFactory,TransformerFactory等的标准行为是访问网络中缺少的实体。 虽然修复建议https://stackoverflow.com/a/9398602/1143126(NullEntityResolver)解决了我的大多数问题,但我想在“离线环境”中以自动方式测试此功能以进行回归。
答案 0 :(得分:2)
Dunes的评论帮助很多(问题How to disable all network connections in Java是相关的),我忽略了其他问题。
以下是我将用于阻止网络连接的内容:
作为java.policy,我使用我在Java安装中找到的默认文件,并添加了以下几行s.t.这些东西适用于TestNG:
// // additional permissions for running TestNG // //
// TestNG reads a lot of properties...
permission java.util.PropertyPermission "*", "read";
// TestNG connects to a local port for debugging, and does some reflection magic
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
// needs at least read access to (default) test suite folder location
permission java.io.FilePermission "C:/Users/<me>/AppData/Local/Temp/-", "read, write";
// if the test case (or, data provider) accesses any other files, add their location. or do it the lazy way:
permission java.io.FilePermission "C:/-", "read, write";
使用该配置,任何对外部源(如www.w3.org)的访问都将导致AccessControlException:
javax.xml.transform.TransformerException: java.security.AccessControlException: access denied (java.net.SocketPermission www.w3.org:80 connect,resolve)
答案 1 :(得分:1)
您可以在本地磁盘上使用存储外部架构(xsd + dtd)的XML catalog。这也加速了正常处理,并允许快速离线开发。
这是一种标准机制。
(特别值得学习的是XHTML,因为有大量的HTML实体。)
答案 2 :(得分:0)
不可否认,我没有对此进行过测试,但我认为应该可以创建java.net.SocketImplFactory
来创建SocketImpl
,这样可以在例如时引发适当的异常。 connect
被称为。{/ p>
正如其他人所指出的,还有可能定义一个安全管理器。我猜,主要区别在于会抛出什么样的例外情况。我认为没有办法阻止这样的解决方案抛出SecurityException
而不是SocketException
或其他IOException
,这对于正确测试错误处理代码可能很重要。