JUnit测试用例错误:“地址已在使用中:绑定”

时间:2017-09-12 16:41:19

标签: spring tomcat spring-boot junit

我为我的项目开发了一个JUnit测试用例 SpringBoot(1.3.5)& JDK 8.当我在STS中以JUnit测试运行我的项目时,全部 测试用例通过,但在每个测试用例结束时给出错误 是:我正在尝试运行JUnit Coverage:

ERROR [ main] o.a.coyote.http11.Http11NioProtocol o.a.j.l.DirectJDKLog.log(DirectJDKLog.java:182) - |||||||||Failed to start end point associated with ProtocolHandler ["http-nio-8080"]
java.net.BindException: Address already in use: bind
    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 org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:340)
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:773)
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:473)
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:986)
    ........
    ........
    ........
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
ERROR [           main] o.apache.catalina.core.StandardService   o.a.j.l.DirectJDKLog.log(DirectJDKLog.java:182) - |||||||||Failed to start connector [Connector[HTTP/1.1-8080]]
org.apache.catalina.LifecycleException: Failed to start component [Connector[HTTP/1.1-8080]]

此错误显示端口8080已在使用中。如何避免这种情况 错误,让我的所有20个测试用例在没有这个的情况下在一个流程中运行 错误?

  

我的代码是:--->

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(KYCNotificationApplication.class)
@ActiveProfiles("local")
@WebIntegrationTest
@IntegrationTest({"server.port=0"})
public class DetermineKYCNotificationServiceImplTest {

    @InjectMocks
    DetermineKYCNotificationServiceImpl kycService;

    @Mock
    KYCOperationsDao kycOperationsDao;

    @Mock
    HttpServletRequest httpServletRequest;

    @Before
    public void setup() throws Exception {
        MockitoAnnotations.initMocks(this);
         ...
    }

    @Test
    public void testMeth1() {
        try {
             .....
            assertTrue(......);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testMeth2() {
        try {
             .....
            assertTrue(......);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  

... 2个更多测试用例......

1 个答案:

答案 0 :(得分:0)

在Spring Boot< 1.4您可以使用@IntegrationTest({"server.port=0"})

为测试类添加注释

在Spring Boot> = 1.4中,您可以使用@SpringBootTest(classes = Application.class , webEnvironment=WebEnvironment.RANDOM_PORT)

两种方法都有相同的效果,即; Spring将分配一个随机端口(并将神奇地更新测试上下文中的应用程序属性以反映此特定于测试的端口)。

更多详情in the docs ...

  

如果您需要启动完整运行的服务器进行测试,我们建议您使用随机端口。如果您使用@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT),则每次测试运行时都会随机选择一个可用端口。

     

@LocalServerPort注释可用于注入测试中使用的实际端口。为方便起见,需要对已启动的服务器进行REST调用的测试还可以@Autowire TestRestTemplate来解析与正在运行的服务器的相对链接。

更新1 :根据您更新的问题,我现在可以看到您正在使用@WebIntegrationTest。在这种情况下,您只需将randomPort参数添加到该注释,例如

@WebIntegrationTest(randomPort = true)