2017-10-15 132 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") 
    ); 
相關問題