可以在Java应用程序中检测系统代理设置,但不能在JUnit中检测 视窗7 Java 1.8.0_45 月蚀火星

可以在Java应用程序中检测系统代理设置,但不能在JUnit中检测 视窗7 Java 1.8.0_45 月蚀火星,java,eclipse,junit,proxy,system-properties,Java,Eclipse,Junit,Proxy,System Properties,如果已将系统代理设置为HTTP,则仅当它从java应用程序的main方法运行时,下方才会打印HTTP 但是,如果从JUnit4测试(在eclipse中)调用它,它总是直接打印DIRECT 还需要注意的是,在eclipse中定义-Djava.net.useSystemProxies=true:运行配置->参数->虚拟机参数。测试只是挂起 知道发生了什么吗 非常感谢 public void printSystemProxy() { System.setProperty("java.net.u

如果已将系统代理设置为HTTP,则仅当它从java应用程序的
main
方法运行时,下方才会打印
HTTP

但是,如果从JUnit4测试(在eclipse中)调用它,它总是直接打印
DIRECT

还需要注意的是,在eclipse中定义
-Djava.net.useSystemProxies=true
:运行配置->参数->虚拟机参数。测试只是挂起

知道发生了什么吗

非常感谢

public void printSystemProxy() {
    System.setProperty("java.net.useSystemProxies", "true");
    try {
        final List<Proxy> list = ProxySelector.getDefault().select(new URI("http://foo/bar"));
        for (final Proxy proxy : list) {
            System.out.println(proxy.type());
        }
    } 
    catch (final URISyntaxException e) {
        throw new IllegalStateException(e);
    }
}
public void printSystemProxy(){
setProperty(“java.net.useSystemProxies”,“true”);
试一试{
final List List=ProxySelector.getDefault().select(新URI(“http://foo/bar"));
对于(最终代理:列表){
System.out.println(proxy.type());
}
} 
捕获(最终URI异常e){
抛出新的非法状态异常(e);
}
}

尝试使用以下VM参数进行TestRunner配置(右键单击/RunAs…):

-Dhttp.proxyHost=<YOUR_PROXY>
-Dhttp.proxyPort=<YOUR_PORT>
-Dhttp.nonProxyHosts=<IF YOU NEED THIS (pipe as separator)>
-Dhttp.proxyUser=<YOUR_NAME>
-Dhttp.proxyPassword=<YOUR_PASWORD>
-Dhttp.proxyHost=
-Dhttp.proxyPort=
-Dhttp.非ProxyHosts=
-Dhttp.proxyUser=
-Dhttp.proxyPassword=

您不能在运行时更改Java的系统代理行为。
java.net.useSystemProxies
系统属性仅在启动时读取。(重点加上):

java.net.useSystemProxies(默认值:false)

在最近的Windows系统和Gnome 2.x系统上,可以告诉java.net堆栈使用系统代理设置,将此属性设置为true(这两个系统都允许您通过其用户界面全局设置代理)请注意,此属性在启动时仅检查一次。

动态设置系统属性不会更改行为。必须使用
-D
将其作为JVM参数发送,就像使用
main
方法一样。另一种选择是不使用系统代理,而是允许用户提供自己的代理


或者,可以在启动应用程序后修改其他代理属性,如
http.proxyHost
http.proxyPort
等(在上面的文档链接中列出)。根据您的应用程序,这可能是一个更好的解决方案,因为它通常具有更好的跨平台支持。

您在Eclipse中设置的代理设置将影响所有工具,包括Eclipse和Maven本身。这可能就是你被“绞死”的原因。。。它可能不是您的JUnit测试,但maven本身是挂起的(需要澄清)

但是,在这种情况下,我觉得您可以在负责JUnit测试的插件中更改系统属性:


org.apache.maven.plugins
:


org.apache.maven.plugins
maven surefire插件
2.18.1
-Djava.net.useSystemProxies=true
还要注意,如果您想在maven中运行它,您必须选择“运行方式->maven测试”,而不是“运行方式->JUnit测试”

[咆哮如下]

我不想这么说,但在这一点上,Java对代理的支持真的很差

一个主要的改进是:现在您可以为要建立的每个连接定义一个单独的代理。然而,我认为这应该得到很大的改善:

  • 每个代理分别进行身份验证。现在,尽管我可以为每个连接定义代理,但对所有连接使用相同的身份验证是不自然的。更糟糕的是,它甚至会为代理和HTTP连接触发相同的身份验证:它甚至无法区分这两个
  • 更好地支持SOCKS代理
  • 更好地支持查询系统以进行代理设置。现在,每个现代操作系统都有一个默认代理的配置
  • 针对实际套接字服务器的内置支持和API

  • 听起来像是一个幻想破灭的程序员的咆哮,但答案在于这些的实现!这值得一个JEP吗?

    将System.getEnv()和System.getProperties()的内容打印到标准输出中(对于main方法和JUnit),并对它们进行比较。肯定会有一些不同,这导致了这个问题。你如何设置代理?你说的“打印HTTP后测试挂起”是什么意思?
    mvn-X
    是否提供了更多信息?在
    MyTestClass
    中运行哪些测试。只有一个测试方法,它调用
    printSystemProxy
    。我在一个干净的项目中再次尝试,maven返回,但如果定义了系统属性,eclipse仍然挂起Junit。谢谢,但想法不是指定任何值,它应该是测试套件的一部分,在测试套件中,每台机器都从系统检测配置,无论是在maven还是在eclipse中。主要目的是使用eclipse运行,maven配置是在挂起时添加的,但随后就变好了(可能是代理问题)+1用于RunAs->maven测试,尽管该特性在pom级别,而不是在单个测试用例上(作为JUnit)