2017-10-15 137 views
0

我有一些Junit测试,我使用WireMock。本地测试通过,但詹金斯我得到的 java.lang.RuntimeException: java.net.BindException: Address already in use在Jenkins的WireMock在Jenkins - BindException:地址已经在使用

错误在我设置dynamicHttpsPort()(其中根据文档“随机asssign在启动 HTTPS端口”)和WireMock配置其本地工作,但詹金斯失败了。

我WireMock配置

@Rule 
    public WireMockRule wireMockRule = new WireMockRule(wireMockConfig() 
      .dynamicHttpsPort() 
      .keystorePath(certsDir.resolve("server.jks").toString()) 
      .keystorePassword(MY_PASS) 
      .keystoreType("JKS") 
    ); 

我有我创建一个新的WireMockRule 2个JUnit类,它们可以同时运行。在其中一个班级中,我有4个考试,而另一个班级中有一个考试。所有5个测试失败。

而且全堆栈跟踪:

com.github.tomakehurst.wiremock.common.FatalStartupException: java.lang.RuntimeException: java.net.BindException: Address already in use 
    at com.github.tomakehurst.wiremock.WireMockServer.start(WireMockServer.java:146) 
    at com.github.tomakehurst.wiremock.junit.WireMockRule$1.evaluate(WireMockRule.java:68) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:172) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:104) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:70) 
Caused by: java.lang.RuntimeException: java.net.BindException: Address already in use 
    at com.github.tomakehurst.wiremock.jetty9.JettyHttpServer.start(JettyHttpServer.java:139) 
    at com.github.tomakehurst.wiremock.WireMockServer.start(WireMockServer.java:144) 
    ... 23 more 
Caused by: java.net.BindException: Address already in use 
    at sun.nio.ch.Net.bind0(Native Method) 
    at sun.nio.ch.Net.bind(Net.java:433) 
    at sun.nio.ch.Net.bind(Net.java:425) 
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) 
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) 
    at wiremock.org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:321) 
    at wiremock.org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) 
    at wiremock.org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236) 
    at wiremock.org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at wiremock.org.eclipse.jetty.server.Server.doStart(Server.java:366) 
    at wiremock.org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at com.github.tomakehurst.wiremock.jetty9.JettyHttpServer.start(JettyHttpServer.java:137) 
    ... 24 more 

回答

0

找到了解决办法here

的问题是,你没有设置在任一HTTP端口,这将始终是积极和默认为8080(因此它们发生冲突)。如果将dynamicPort()添加到两个配置中,它应该修复它。

因此增加dynamicPort()固定它:

@Rule 
    public WireMockRule wireMockRule = new WireMockRule(wireMockConfig() 
      .dynamicPort() 
      .dynamicHttpsPort() 
      .keystorePath(certsDir.resolve("server.jks").toString()) 
      .keystorePassword(MY_PASS) 
      .keystoreType("JKS") 
    ); 
相关问题