为什么 Java 测试看不到 java.net.useSystemProxies
把对启动时机敏感的 Java 代理发现选项传给运行测试的 JVM,而不只是传给应用或构建启动器。
你的应用能检测到系统代理,但 JUnit 测试却检测不到。在修改检测代码之前,先确认每个进程由哪个 JVM 运行、它收到了哪些参数。
JDK 文档把 java.net.useSystemProxies 描述为在启动时只检查一次的属性。在测试方法内部设置它,可能已经太晚,无法改变那次启动决定。
IDE 应用启动器、IDE 测试运行器、Maven 本身,以及分叉出来的 Surefire 测试进程,都可能有不同的 VM 参数。某个启动器里的代理设置,并不能证明另一个启动器把它传了下去。
检查分叉进程的配置
Surefire 的 argLine 为分叉执行提供命令行 JVM 选项。当测试在这样的分叉中运行时,启动选项可以放在那里:
<argLine>-Djava.net.useSystemProxies=true</argLine>把该选项合并进项目现有的配置。替换已有的 argLine 可能会丢掉覆盖率代理或其他必需的 JVM 设置。如果构建不使用任何分叉,就改为检查真正承载测试的那个 JVM;按照文档,argLine 只对分叉执行有效。
通过测试框架的属性机制提供的、对启动不敏感的属性,生命周期并不相同。不要仅仅因为测试期间 System.getProperty() 返回了期望的字符串,就认定每个属性都足够早地到达了 VM。
对于针对性的代理路由测试,显式配置的客户端也可以减少对桌面配置的依赖。Java 11+ 的 HttpClient 可以为该目的使用客户端本地的 HTTP ProxySelector。请让这一选择在测试意图中保持可见:测试客户端路由与测试操作系统的代理发现是不同的检查。