使用嵌入式 tomcat 服务器进行 JUnit 测试,如何为 http 和 https 连接器指定自动端口?
描述
我做了一个 JUnit 测试,重点是尝试测试对 SOAP Web 服务的调用。
我正在使用嵌入式tomcat服务器进行测试,以便使用模拟服务器运行我的测试。
我还同时使用http和https连接器。
我需要为这两个连接器使用自动端口,因为测试是在 Jenkins 服务器上运行的,我不能只使用端口 443 或 8443,因为它们已经被占用了。
我知道使用端口0作为标准端口将导致tomcat使用自动端口分配,但我无法设法将其与两个连接器一起使用。
预期行为
我想对我的自定义 SSL 连接器也使用自动端口分配。
是否有可能以某种方式这样做?
示例代码
这是我的tomcat实例的代码:
@Before
public void setup() throws Throwable {
    File tomcatWorkingDir = new File(mWorkingDir);
    //Empty the target/tomcat-working-dir directory if it exist
    //Create the directory otherwise
    if(tomcatWorkingDir.exists() && tomcatWorkingDir.isDirectory()){
        LOGGER.info("cleaning tomcat-working-dir directory");
        FileUtils.cleanDirectory(new File(mWorkingDir)); 
    } else {
        LOGGER.info("create tomcat-working-dir directory");
        tomcatWorkingDir.mkdir();
    }
    LOGGER.info("disabling ssl certification validation");
    //Disable JVM ssl sockets connection
    disableJVMCertificate();
    //Add server certificate
    createServerCertificate();
    //Custom SSL Connector
    Connector SSLConnector = getSSLConnector();
    mTomcat = new Tomcat();
    //Standard http startup port
    mTomcat.setPort(0);
    //Set up base directory 
    //Otherwise, tomcat would use the current directory
    mTomcat.setBaseDir(mWorkingDir);
    LOGGER.info("setting the ssl connector in TOMCAT");
    Service service = mTomcat.getService();
    service.addConnector(SSLConnector);
    //Redirect current port
    Connector defaultConnector = mTomcat.getConnector();
    defaultConnector.setRedirectPort(SERVER_HTTPS_PORT);
    //Configure the way WAR are managed by the engine
    mTomcat.getHost().setAutoDeploy(true);
    mTomcat.getHost().setDeployOnStartup(true);
    //Add mock server into our webApp
    String servletName = "/server";
    File webApp = new File(mWorkingDir,"../../../ws-mock-server/src/main/webapp");
    mTomcat.addWebapp(mTomcat.getHost(), servletName, webApp.getAbsolutePath());
    //start tomcat
    LOGGER.info("starting TOMCAT");
    mTomcat.start();
  }
和这里为我的自定义 ssl 连接器。
    private static Connector getSSLConnector(){
    Connector connector = new Connector();
    connector.setPort(SERVER_HTTPS_PORT);
    connector.setSecure(true);
    //Http protocol Http11AprProtocol
    connector.setAttribute("protocol", "org.apache.coyote.http11.Http11AprProtocol");
    //Maximum threads allowedd on this instance of tomcat
    connector.setAttribute("maxThreads","200");
    connector.setAttribute("SSLEnabled", true);
    //No client Authentification is required in order to connect
    connector.setAttribute("clientAuth", false);
    //SSL TLSv1 protocol
    connector.setAttribute("sslProtocol","TLS");
    //Ciphers configuration describing how server will encrypt his messages
    //A common cipher suite need to exist between server and client in an ssl
    //communication in order for the handshake to succeed
    connector.setAttribute("ciphers","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA");
    LOGGER.info("setting keystore file");
    //Here an absolute file path is needed in order to properly set up the keystore attribute
    connector.setAttribute("keystoreFile",new File(".").getAbsolutePath().replace("\\", "/")+"/"+mWorkingDir+"/server.jks");
    LOGGER.info("setting keystore pass");
    connector.setAttribute("keystorePass","changeit");
    return connector;
}
 
					 
				 
				    		 
				    		 
				    		 
				    		