개요
업무상 레거시 Spring Boot 1.5.x 버전을 유지보수할 때,
테스트 코드를 도입하면서 JUnit5를 사용하고 싶었다.
하지만 Spring Boot 1.x에서는 JUnit5를 공식 지원하지 않기 때문에 JUnit4를 사용하다가,
여러 방면으로 시도해보다 JUnit5 연동을 성공하게 되어 포스팅으로 남기게 되었다.
spring-test-junit5
위에서 언급한 대로 JUnit5는 Spring Boot 2.x (Spring 5.x) 버전부터 공식적으로 지원한다.
하지만 JUnit 공식 프로토타입 역할을 했던 아래 Repository를 참고해 보면,
해당 프로젝트를 이용하면 Spring Framework 4.3.x의 JUnit5 지원이 가능하다고 적혀있다.
https://github.com/sbrannen/spring-test-junit5
This project served as the official prototype for JUnit 5 testing support in the Spring TestContext Framework and has been incorporated into Spring Framework 5.0 in conjunction with SPR-13575.
Consequently, no further work is planned in this repository in terms of new features: new features are only supported in Spring Framework 5.0+. Note, however, that this project can in fact be used for JUnit Jupiter testing support in conjunction with Spring Framework 4.3.x.
최소 지원 버전
공식 문서 기준 최소 지원 버전은 아래와 같다.
- JDK 8
- Spring Framework 4.3.24.RELEASE
Spring Framework 4.3.24.RELEASE를 사용하는 Spring Boot 버전은 아래와 같다.
- Spring Boot 1.5.21.RELEASE
Spring Boot 1.x 는 1.5.22.RELEASE가 마지막 버전이다.
따라서 1.5.21.RELEASE 혹은 1.5.22.RELEASE 버전 사용이 필수적이다.
프로젝트 의존성 추가
프로젝트의 build.gradle에서 아래와 같은 설정을 추가해 보자.
repositories {
mavenCentral()
maven { url 'https://jitpack.io' } // 1
}
dependencies {
testImplementation 'com.github.sbrannen:spring-test-junit5:1.5.0' // 2
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.0' // 3
testImplementation ('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit', module: 'junit' // 4
}
}
test {
useJUnitPlatform() // 5
}
- spring-test-junit5가 jitpack에 배포되어 있으므로 jitpack repository를 추가한다.
- jitpack에 배포되어 있는 spring-test-junit5 의존성을 추가한다.
- spring-test-junit5는 Jupiter 5.5.0을 사용하므로 해당 버전의 jupiter-engine을 추가한다.
- Spring Boot 1.5.x의 spring-boot-starter-test에는 JUnit4 의존성이 포함되어 있으므로 해당 의존성을 제거한다. (선택사항)
- JUnit5를 테스트 시 사용하기 위해 useJUnitPlatform() 설정을 추가한다.
테스트
모든 설정을 마쳤으니 테스트 코드를 작성해서 잘 동작하는지 테스트해 보자.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
class ExampleTest {
@DisplayName("JUnit5 테스트")
@Test
void test() {
System.out.println("success!");
}
}
- @Test 어노테이션은 org.junit.Test 가 아닌, JUnit5 기반의 org.junit.jupiter.api.Test를 사용해야 한다.
(JUnit4 의존성을 제거하면 org.junit.Test는 제거된다.)
테스트가 잘 실행되었고, @DisplayName 기반의 테스트 명세도 잘 동작한 것을 확인할 수 있다.
번외) JDK 8 미만 버전을 사용하고 있는 경우
JUnit5는 위의 방법으로 적용하더라도 JDK 8 이상부터 지원한다.
따라서 프로젝트가 JDK 8 미만인 경우 사용할 수 없다.
하지만 대부분의 경우 운영 환경의 빌드 결과물만 JDK 7 미만으로 빌드되면 되기 때문에,
테스트 시에만 JDK 8 이상으로 구동한다면 문제가 없을 것이다.
따라서 아래와 같이 IntelliJ에서 테스트를 Gradle로 실행하도록 설정하고,
Gradle JVM 버전을 JDK 8 이상으로 실행하면 테스트 시 문제없이 동작할 것이다.
'Java & Spring' 카테고리의 다른 글
[사내 세미나] Spring Batch 도입하기 (3) | 2024.09.04 |
---|---|
[Spring] 레거시 프로젝트에 Testcontainers 도입하기 (2) | 2024.07.07 |
Spring Boot 무료로 배포하기 (Koyeb, GitHub) (0) | 2024.03.21 |
[Spring] eventListener, transactionalEventListener 예외 및 트랜잭션 전파 총정리 (0) | 2023.12.29 |
[Spring] QueryDsl transform 및 SqmCaseSearched 오류 해결방법 with Hibernate 6.x (0) | 2023.10.05 |