현재 상황
IDE(VSCode)에서는 단위 테스트가 정상적으로 된다.
하지만 Gradle Job을 통한 단위 테스트는 실패한다.
테스트 결과가 실패인 게 아니라 테스트 Job 자체의 실패가 발생한다.
OpenJDK 17
Spring Boot 2.6.6
Junit 5
Gradle 7.4.1
모두 테스트가 정상 통과된다.
사내 프로젝트다 보니 전체 패키지명은 못 보여드림
***ApplicationTests > testMessage() FAILED
java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658
Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185
Caused by: java.lang.IllegalStateException at Assert.java:97
해당 오류 메시지를 가지고 여기저기 찾아봐도 나의 문제와 동일한 현상은 없었다.
그중에는 다음과 같은 해결책을 제시했다.
import org.junit.jupiter.api.Test;
를 import org.junit.Test;
로 변경하루동안 고민해봤는데 두 번째 해결책을 다시 보게 됐다.
핵심은 테스트할 때 H2 DB에 연결할 수 있는가?
이다.
test 프로필에는 별도로 datasource 항목을 정의해뒀기 때문에 다른 DB에 연결될 일도 없었다.
spring:
config:
activate:
on-profile:
- test
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
logging:
level:
root: info # 테스트 속도 향상을 위해 info로 설정
그렇다면 H2 DB에 연결할 때 필요한 재료(JDBC 드라이버 같은)들은 잘 있을까?
Gradle의 Dependency 설정을 보자
dependencies {
...
developmentOnly "com.h2database:h2" //로컬 환경 및 테스트할 때만 사용
compileOnly "org.mariadb.jdbc:mariadb-java-client" //빌드 이후에 사용
...
}
마지막으로 Gradle의 test 태스크는 빌드 및 패키징이 완료된 후 실행
한다.
그렇다면 저 developmentOnly
를 implementation
으로 바꿔서 다시 Gradle test를 해보자.
아주 가볍게 성공.
그렇다. 나름대로 패키지 구성을 멋지게 한다고 Gradle의 Dependency Scope를 이리저리 구성해놓은게 독이 됐다.
Gradle의 LifeCycle을 생각하지도 않고 단위 테스트에 필요한 Dependency를 개발 환경에만 적용되게 해놓은 것이 원인이었다.
H2 DB에 대한 패키지 외에 Dependency Scope가 다르게 설정돼있는 패키지도 몇몇개 있는데 이걸 다 implementation
로 바꿔야할까 싶기도 하다.
그렇게되면 Dependency Scope는 별 의미 없는 것일까....?