JUnit 测试用例错误:"Address already in use: bind"



我有一个针对我的项目的junit测试用例Springboot(1.3.5)&JDK 8.当我在STS中以Junit测试作为Junit测试时,全部测试用例通过,但在每个测试用例结束时会出现错误,是:我试图运行Junit覆盖范围:

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();
        }
    }

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

在Spring Boot&lt中;1.4您可以用@IntegrationTest({"server.port=0"})

注释测试类

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

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

文档中的更多详细信息...

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

@LocalServerPort注释可用于将使用的实际端口注入测试。为了方便起见,需要对启动服务器进行休息的测试可以另外可以@Autowire A TestRestTemplate,该测试将解决与运行服务器的相对链接。

更新1 :基于您更新的问题,我现在可以看到您正在使用@webintegrationTest。在这种情况下,您可以简单地将randomPort参数添加到该注释,例如

@WebIntegrationTest(randomPort = true)

相关内容

最新更新