如何让Java类初始化另一个类,并有条件地执行静态Java代码块

How to make Java class to initialize another class, and execute static java code block conditionally

提问人:tarekahf 提问时间:7/29/2023 最后编辑:tarekahf 更新时间:7/29/2023 访问量:24

问:

我正在使用 WireMock 并设法将其配置为在 JUnit 4 测试中使用 SSL,并在主机名与 WireMock 自签名证书不匹配时禁用抛出错误。CN=Tom Akehurst

我添加到 JUnit 测试类的代码块:

    static {
        //for localhost testing only
        javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(newJavaKeyword javax.net.ssl.HostnameVerifier() {
            public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
                if (hostname.equals("localhost")) {
                    return true;
                }
                return false;
            }
        });
    }

注意:替换为新的,因为如果不这样做,它就不会发布。newJavaKeyword

以下是未添加上述代码时抛出的错误:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found

现在,我需要将测试从本地移动到服务器,并且我仍然需要使用所有配置的 JSON 映射。这一次,测试用例将从主进程运行,而不是从 JUnit 运行,因此我需要添加要传递给 class 的标志,该标志将初始化 class 。在课堂上,我只想在标志是 时运行上面的静态代码块。WireMockdisableVerifyLocalHostABBdisableVerifyLocalHosttrue

我想我可以将上面的代码块放在一个普通的公共方法中,但我想静态代码块的目的是确保代码只会运行一次。

我的理解是静态代码块会很早就运行,所以我需要确保在运行上面的静态代码块之前已经初始化了标志。另外,我认为标志也必须是静态的。disableVerifyLocalHostdisableVerifyLocalHost

以下是我认为应该如何实现,但不确定:

public class A {

   private static boolean disableVerifyLocalHost = false;
   public static setDisableVerifyLocalHost(...) {...}
   public static boolean getDisableVerifyLocalHost(.) {...}
   
   public callClassB() {
       B classB = new B()
   }
}


public class B {

    static {
        //for localhost testing only
        if (A.getDisableVerifyLocalHost()) {
            javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(newJavaKeyword javax.net.ssl.HostnameVerifier() {
                public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
                    if (hostname.equals("localhost")) {
                        return true;
                    }
                    return false;
                }
            });
        }
    }
}

我的问题是如何确保初始化标志的代码与禁用检查主机名的代码之间的依赖关系?或者,如果您有更好的建议,请告诉我。disableVerifyLocalHostlocalhost

java 初始化 static-members wiremock 控制流

评论


答: 暂无答案