Programing/Java & Spring

세무민의 코딩일기 : Junit > Port was already in use 해결 방법

세기루민 2024. 2. 27. 16:52
728x90

안녕하세요

세기무민입니다.

 

오늘 포스팅 할 내용은 테스트 코드를 작성하다가 우연히 발견한 내용에 대해 기록으로 남겨보려고 합니다.

 


1. 현상

 

단일 테스트 코드를 실행했을 때는 문제가 없으나 통합하여 실행 시 몇몇 테스트 코드들에서 위와 같이

현재 Port 가 사용중이라는 오류가 발생하였습니다. 

 

원인으로 추정되는 건 아직 없으나, 이전에 Java 11 버전과 그에 맞는 Javax, Tomcat 버전을 사용했을 때는 

위와 같은 문제는 발생하지 않았었으며 버전 올린 후 Junit에서 Tomcat Port가 잡힌다는 점에서

버전 upgrade에 따른 이슈라고 판단된다.

  • Java 17 Version으로 올리면서 jakarta 및 Tomcat Version은 올렸으나 junit은 그대로 4 version을 사용했는데 뭔가 여기서 꼬인 느낌이였다.

이에 따라 StackOverFlow를 참조하여 아래와 같은 해결 방안들을 시도해봤습니다.

 


 

2. 시도 (해결 안됨)

2.1 management.server.port 변경 (해결 안됨)

기존 포트와 management 포트를 분리하는 방법이며 변경하면 된다는 방법이 있어서 변경하였으나 당연하게도 테스트를 위한 컨텍스트가 N개가 뜨면서 N개 모두 같은 포트를 가지게 되어 동일한 오류가 발생하였습니다.

 

2.2 Spring Boot Version 3.2.0 -> 3.1.5 downGrade(해결 안됨)

Spring Boot Version을 하위 버전으로 낮추면 실행이 된다는 의견도 있어서 동일하게 하였으나 문제는 해결되지 않았습니다. 

 

 

3. 해결 방안

3.1 WebEnvironment.RandomPort (해결은 되지만 랜덤 포트의 어플리케이션 컨텍스트를 띄우게 됨)

실질적으로 해결할 수 있는 방법 중 하나였으나 랜덤 포트로 어플리케이션 컨텍스트를 생성하는 방법이다보니..

Port 관련 테스트가 아니면 비효율적이라고 판단되어 다른 방법을 사용

 

3.2 @DirtiesContext

@DirtiesContext 어노테이션을 사용하는 방법이였습니다.

해당 방법은 어플리케이션 컨텍스트를 재생성하는 어노테이션으로 기존의 경우 리소스 효율을 위해 기존 어플리케이션 컨텍스트를 캐싱하여 사용하는데, 해당 어노테이션을 사용할 경우 기존 컨텍스트와 별도로 개별 생성을 한다. 

이는 장점도 있으나 테스트 코드가 많을 경우 실행 시간이 느려지는 단점이 있다. 

원래는 사용하려했으나 처리 속도가 많이 늦어질 것 같아서 위의 방법은 사용하지 않았다.

 

3.3 WebEnvironment.NONE

위에 언급된 방법들을 사용해도 무관하고 사실 RandomPort로 설정하여 포트 충돌을 막아주면 문제가 없지만 아에

포트 자체를 설정하지 않는 것이 조금 더 효율적이라는 생각이 들어서 WebEnvironment.NONE으로 처리하였고

문제는 해결되었다. 

 

관련 코드는 아래와 같다.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
@ActiveProfiles("local")
public class tomcatPortConflictTest {
	
    @Test
    public void get_restart_success_test() {
    	...
    }
}

@SpringBootTest 어노테이션에 WebEnvironment.NONE을 설정 해 주면 된다. 

 

 

 


 

참조 : https://stackoverflow.com/questions/42249791/resolving-port-already-in-use-in-a-spring-boot-test-defined-port

 

Resolving port already in use in a Spring boot test DEFINED PORT

I have a spring boot application that fires up and executes a class that listens to Application Ready event to call an external service to fetch some data and then use that data to push some rules ...

stackoverflow.com

 

728x90