shinsunyoung / springboot-developer-2rd

📚 <스프링부트 3 백엔드 개발자 되기 2판> 예제코드
47 stars 10 forks source link

[Chapter 12] 챕터 12에서 CI 실행 오류 문제 #8

Closed SungHuii closed 3 months ago

SungHuii commented 3 months ago

챕터 12에서 ci.yml을 추가한 뒤 github에서 확인을 했을 때 체크표시가 뜨지 않고 X 표시가 나옵니다. 눌러서 확인해보니 Build with Gradle 에서 오류가 나는데 test구문에서 실패했다고 뜨는데, 로컬환경에서는 테스트가 전부 통과됩니다. 로컬환경 gradle 버전 확인도 해봤는데 뭐가 문제인지 감이 잘 안잡히네요 ..

깃허브 코드 공유드립니다.. https://github.com/SungHuii/Blog.git

4m 8s Run ./gradlew clean build ./gradlew clean build shell: /usr/bin/bash -e {0} env: JAVA_HOME: /opt/hostedtoolcache/Java_Zulu_jdk/17.0.11-9/x64 JAVA_HOME_17_X64: /opt/hostedtoolcache/Java_Zulu_jdk/17.0.11-9/x64 Downloading https://services.gradle.org/distributions/gradle-8.5-bin.zip ............10%.............20%............30%.............40%.............50%............60%.............70%.............80%............90%.............100%

Welcome to Gradle 8.5!

Here are the highlights of this release:

For more details see https://docs.gradle.org/8.5/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

Task :clean UP-TO-DATE

Note: Some input files use or override a deprecated API.

Task :compileJava Note: Recompile with -Xlint:deprecation for details.

Task :processResources Task :classes Task :resolveMainClassName Task :bootJar Task :jar Task :assemble Task :compileTestJava Task :processTestResources NO-SOURCE Task :testClasses

Task :test

TokenProviderTest > validToken(): 유효한 토큰일 때에 유효성 검증에 성공한다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1773 Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException at ScriptUtils.java:282 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException at DbException.java:514

TokenProviderTest > validToken(): 만료된 토큰인 때에 유효성 검증에 실패한다. FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

TokenProviderTest > getAuthentication(): 토큰 기반으로 인증 정보를 가져올 수 있다. FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

TokenProviderTest > getUserId(): 토큰으로 유저 ID를 가져올 수 있다. FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

TokenProviderTest > generateToken(): 유저 정보와 만료 기간을 전달해 토큰을 만들 수 있다. FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

BlogApiControllerTest > deleteArticle: 블로그 글 삭제에 성공한다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1773 Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException at ScriptUtils.java:282 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException at DbException.java:514

BlogApiControllerTest > findArticle: 블로그 글 조회에 성공한다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

BlogApiControllerTest > findAllArticles: 블로그 글 목록 조회에 성공한다. FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

BlogApiControllerTest > addArticle: 블로그 글 추가에 성공한다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

BlogApiControllerTest > updateArticle: 블로그 글 수정에 성공한다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

TokenApiControllerTest > createNewAccessToken : 새로운 액세스 토큰을 발급한다. FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

11 tests completed, 11 failed

Task :test FAILED

FAILURE: Build failed with an exception.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.5/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 4m 7s 8 actionable tasks: 7 executed, 1 up-to-date Error: Process completed with exit code 1.

shinsunyoung commented 3 months ago

안녕하세요, 요건 부록A, B를 한 코드에서 똑같이 적용하다보니 생긴 문제로 보이는데요. GlobalExceptionHandler.java에서 모든 예외를 대상으로 Internal Server Error를 반환하고 있는 것을 확인할 수 있습니다.

@ExceptionHandler(Exception.class)
    protected ResponseEntity<ErrorResponse> handle(Exception e){
        e.printStackTrace();
        log.error("Exception", e);
        return createErrorResponseEntity(ErrorCode.INTERNAL_SERVER_ERROR);
    }

그런데 깨지는 테스트 코드를 보면 유효성 검사에 실패했을 때는 400 응답 코드를 반환해야 하는데 500 응답 코드를 반환하고 있어 테스트가 실패하는 것을 확인할 수 있습니다.

Status
Expected :400
Actual   :500
<Click to see difference>

그래서 이 에러를 해결하려면 Validation 예외가 발생했을 때는 400을 반환하게 처리해주면 됩니다. GlobalExceptionHandler.java에 대한 처리를 Exception 상단에 추가해주면 됩니다.

https://github.com/shinsunyoung/springboot-developer-2rd/commit/deb90b1c963f31401b9b50cb427852200082a0f7 에 커밋해두었으니 보고 따라하시면 CI도 잘 돌 것으로 예상됩니다. 혹시나 안되면 다시 코멘트 남겨주세요 🙇

SungHuii commented 3 months ago

감사합니다! 🙇