신비한 개발사전

JUnit Jupiter와 Platform의 의존성 충돌 본문

Java

JUnit Jupiter와 Platform의 의존성 충돌

jbilee 2025. 9. 2. 21:45

자바 빌드 파일에 JUnit Jupiter와 JUnit Platform 의존성을 잘못 추가하면 생길 수 있는 문제와, 그런 문제를 해결한 과정을 통해 알게 된 것들을 정리해보려고 한다.

 

버전 불일치

클론해온 모 프로젝트의 테스트 코드를 실행하자 콘솔창이 빨간 텍스트로 채워지면서 테스트가 시작도 못해보고 강제 종료되었다.

 

테스트 자체를 실행할 수 없는 문제는 지금까지 한 번도 겪어보지 못했는데, 심지어 콘솔창에 남는 오류 관련 정보가 없어서 따로 생성된 Test Summary 리포트 파일에 직접 들어가서 이슈를 파악해야 했다.

 

Stack trace에는 아래와 같은 내용이 있었다.

The following conflicting versions were detected:
- org.junit.jupiter.api: 5.13.3
- org.junit.jupiter.engine: 5.13.3
- org.junit.platform.commons: 1.12.2
- org.junit.platform.engine: 1.12.2
- org.junit.platform.launcher: 1.12.2

 

JUnit을 사용하려면 org.junit.jupiter와 org.junit.platform 패키지를 설치해야 하는데, 이때 둘의 버전이 항상 일치해야 한다.

 

Jupiter가 5.13.3 버전이면 Platform은 1.13.3 버전이어야 하는데, Platform의 버전이 더 낮은 것이 문제였다.

 

나의 경우엔 테스트와 관련된 의존성이 이미 아래처럼 설정돼있었는데, spring-boot-starter-test는 아직 12버전 junit 패키지들을 사용하고 있어서 명시적인 13버전 사용으로 인해 불일치가 생겼던 것으로 보인다.

dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.13.3'
}

 

spring-boot-starter-test 패키지가 JUnit 의존성을 관리해주기 때문에 명시돼있던 junit 의존성만 제외하고 다시 빌드하니 기대했던 대로 테스트가 돌아가는 것을 확인할 수 있었다.

 

버전만 잘 관리하면 발생하지 않는 문제지만, 공식 문서에서는 내가 겪은 케이스처럼 실수로라도 버전이 달라지는 상황이 발생할 수 있어서 Spring에게 맡기지 않는다면 아래 예시처럼 BOM 사용을 권장한다.

dependencies {
    testImplementation(platform("org.junit:junit-bom:5.13.4"))
    testImplementation("org.junit.jupiter:junit-jupiter")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

 

Platform launcher의 부재

누락된 의존성으로 인해 테스트가 실행되지 않는 상황도 발생할 수 있다. spring-boot-starter-test 의존성만 제외한 아래의 경우에도 빌드가 실패한다. 어느 부분이 문제인 걸까?

dependencies {
    testImplementation 'org.assertj:assertj-core:3.27.3'
    testImplementation 'org.mockito:mockito-core:5.18.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.13.3'
}

 

빌드툴이 JUnit 테스트를 돌리기 위해서는 JUnit Platform에서 제공하는 Launcher API가 필요하다.

 

Spring에서는 이 런처 또한 기본으로 포함되어 있어서 그동안 문제 없이 테스트를 돌릴 수 있었던 것 같다. 런처는 런타임으로 org.junit.platform:junit-platform-launcher 패키지를 추가해주기만 하면 된다.

dependencies {
    testImplementation 'org.assertj:assertj-core:3.27.3'
    testImplementation 'org.mockito:mockito-core:5.18.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.13.3'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

 

 

JUnit 테스트가 빌드 단에서 실패하면 이번에 정리한 두 케이스를 먼저 점검해보면 좋을 것 같다.

 

참고: