Gradle import 설정과 test 실패

KHS·2022년 8월 26일
0

trouble shooting

목록 보기
1/3
post-thumbnail

빌드 이후 단위 테스트 오류 발생

현재 상황

IDE(VSCode)에서는 단위 테스트가 정상적으로 된다.

하지만 Gradle Job을 통한 단위 테스트는 실패한다.

테스트 결과가 실패인 게 아니라 테스트 Job 자체의 실패가 발생한다.

프로젝트 주요 스택

OpenJDK 17
Spring Boot 2.6.6
Junit 5
Gradle 7.4.1

IDE 내 단위 테스트 결과

모두 테스트가 정상 통과된다.

사내 프로젝트다 보니 전체 패키지명은 못 보여드림

오류 로그

***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

해당 오류 메시지를 가지고 여기저기 찾아봐도 나의 문제와 동일한 현상은 없었다.

그중에는 다음과 같은 해결책을 제시했다.

  1. JUnit @Test 어노테이션의 패키지 변경
    1.1. import org.junit.jupiter.api.Test;import org.junit.Test;로 변경
    1.2. 현재 Gradle 구성 상 저런 패키지를 가져올 수 없었다.
  2. test 프로필에 사용하는 H2 DB가 연결 가능한지 확인해라
    1.1. test 프로필에 연결돼있는 H2 DB는 Memory DB이다.
    1.2. Embedded DB이기 때문에 연결 가능한지 확인해볼 필요가 없다.

그렇다면 어디가 문제인가?

하루동안 고민해봤는데 두 번째 해결책을 다시 보게 됐다.

핵심은 테스트할 때 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 태스크는 빌드 및 패키징이 완료된 후 실행한다.

어?

그렇다면 저 developmentOnlyimplementation으로 바꿔서 다시 Gradle test를 해보자.

아주 가볍게 성공.

그렇다. 나름대로 패키지 구성을 멋지게 한다고 Gradle의 Dependency Scope를 이리저리 구성해놓은게 독이 됐다.

Gradle의 LifeCycle을 생각하지도 않고 단위 테스트에 필요한 Dependency를 개발 환경에만 적용되게 해놓은 것이 원인이었다.

H2 DB에 대한 패키지 외에 Dependency Scope가 다르게 설정돼있는 패키지도 몇몇개 있는데 이걸 다 implementation로 바꿔야할까 싶기도 하다.

그렇게되면 Dependency Scope는 별 의미 없는 것일까....?

profile
Java & Vue ...

0개의 댓글