강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

서버개발자 과제전형 완벽가이드 - 1편

17강 api서버구현2 질문있습니다.(ai답변이 이상합니다.)

해결된 질문

작성

·

66

·

수정됨

0

에러상황:

Caused by: java.lang.AssertionError: Range for response status value 401 expected:<SUCCESSFUL> but was:<CLIENT_ERROR>

at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)

at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)

at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$is2xxSuccessful$3(StatusResultMatchers.java:80)

at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)

at com.example.controller.BookControllerItTest.정상인자로 요청시 성공한다.(BookControllerItTest.groovy:43)

관련 내용을 검색해 보니 401 에러는 보통 로그인/인증 문제로, SecurityConfig.java 파일 등을 수정하라는 안내를 봤습니다. 다만, 현재 수강 중인 강의에는 로그인 기능이 없는 상황입니다.

이 경우, 인증 없이 테스트가 통과되도록 설정을 변경하려면 어떻게 해야 할지 조언 부탁드립니다.

참고로, 관련 파일은 메일로 함께 전달드렸습니다.

감사합니다.

 

답변 2

0

J Tech님의 프로필 이미지
J Tech
지식공유자

안녕하세요!

요거 확인이 늦었네요!

전달주신 코드를 보니 강의내에서 사용되는 버전과 상이한것으로 보여서요, 먼저 강의자료내에서 사용된 버전과 동일하게 맞춰보시겠어요?

zzzzz님의 프로필 이미지
zzzzz
질문자

id 'org.springframework.boot' version '3.2.5'

 

dependencyManagement {
    imports {
       mavenBom "org.springframework.cloud:spring-cloud-dependencies:2023.0.1"
    }
}

안녕하세요. 위와 같이 강의 버전과 동일하게 했으나 동일한 에러가 조회됩니다. pc가 문제인지 알아서 pc 방 pc에서 인텔리제이 깔아서 실행해도 동일합니다.

J Tech님의 프로필 이미지
J Tech
지식공유자

아이고! pc방까지 가셨군요 ㅠ

이부분 강의자료코드로 돌렸을때는 돌아가긴하는데요, 일단 메일로 전달주신 코드기반으로는 아래와같이 수정해보시겠어요?

요게 repository에서 client를 물고 뜨면서 인증을하려고하는 느낌이라... 아래와같이 시도를 다시 해보시고 말씀주세요 🙏

@SpringBean
BookRepository bookRepository = Mock() // <- 새로 추가 

...

def "정상인자로 요청시 성공한다."() {
        given:
        def request = new SearchRequest(query: "HTTP", page: 1, size: 10)
        def mockResponse = new PageResult<>(1, 10, 10, [Mock(SearchResponse)])

        and:
        bookRepository.search(request.query, request.page, request.size) >> mockResponse

        when:
        def result = mockMvc.perform(MockMvcRequestBuilders.get("/v1/books")
...
zzzzz님의 프로필 이미지
zzzzz
질문자

class BookControllerItTest extends Specification {
    @Autowired
    MockMvc mockMvc

    @SpringBean
//    BookQueryService bookQueryService = Mock()
    BookRepository bookRepository = Mock()

    def "정상인자로 요청시 성공한다."() {
        given:
        def request = new SearchRequest(query: "HTTP", page: 1, size: 10)
        def mockResponse = new PageResult<>(1, 10, 10, [Mock(SearchResponse)])

        and:
//        bookQueryService.search(*_) >> new PageResult<>(1, 10, 10, [Mock(SearchResponse)])
        bookRepository.search(request.query, request.page, request.size) >> mockResponse

        when:
        def result = mockMvc.perform(MockMvcRequestBuilders.get("/v1/books")
                .param("query", request.query)
                .param("page", request.page.toString())
                .param("size", request.size.toString()))

        then:
        result.andExpect(status().is2xxSuccessful())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath('$.totalElements').value(10))
                .andExpect(jsonPath('$.page').value(1))
                .andExpect(jsonPath('$.size').value(10))
                .andExpect(jsonPath('$.contents').isArray())
    }

 

 

감사합니다. 선생님. // bookQueryService.search(*_) >> new PageResult<>(1, 10, 10, [Mock(SearchResponse)]) 이 부분이랑 BookQueryService bookQueryService = Mock() 이 부분 지우면 통과되는데 근데 when,then,given만 같고 bookRepository.search 이부분 만 추가해줬는데 왜 통과되는거에요? 혹시 서비스에서 거쳐서 레파지토리를 호출하는것이 아니라 레파지토리에서 직접 호출하기 때문에 결과가 같은건가요?

J Tech님의 프로필 이미지
J Tech
지식공유자

요게 통합테스트로 컨텍스트(service, repository등)를 다 띄우려고하는데 repository에서 사용되는 client를 로드해서 호출할때 인증관련 오류가 발생하는것으로 보입니다! 마지막에 말씀주신 service는 거치긴합니다.

현재 테스트내의 관심사가 아니기때문에 repository계층을 mocking해서 처리하는방식으로 시도해본거라고 보시면 될것같아요~

0

안녕하세요, 인프런 AI 인턴입니다. zzzzz님,

현재 발생하고 있는 401 CLIENT_ERROR는 인증 문제와 관련된 에러입니다. 강의에서는 로그인 기능을 다루지 않기 때문에, 바로 인증 설정을 변경하여 테스트를 통과시키는 방법을 안내드리겠습니다.

에러 해결을 위한 조치 사항:

  1. Spring Security 비활성화:

    • 강의 중에 인증을 다루지 않는 상황에서는 보통 테스트 환경에서 Spring Security를 비활성화하여 인증 없이 테스트가 진행되도록 설정할 수 있습니다. @SpringBootTest로 통합 테스트를 진행 중이라면, 보안 설정을 일시적으로 비활성화하는 방법이 유효할 수 있습니다.
  2. SecurityConfig 파일 수정:

    • 만약 SecurityConfig 라는 설정 파일이 존재한다면, 아래와 같은 코드로 보안을 비활성화할 수 있습니다.
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
       @Override
       protected void configure(HttpSecurity http) throws Exception {
           http.csrf().disable()
               .authorizeRequests().anyRequest().permitAll(); // 모든 요청을 인증 없이 허용
       }
    }
    
  3. 프로파일을 사용하여 테스트 시 보안 설정 무시:

    • application-test.properties 또는 application-test.yml 파일을 생성하여 테스트 시 특정 Security 설정을 무시하도록 프로파일을 활용하는 방법도 있습니다.
  4. 테스트 메서드에서 MockMvc 설정 변경:

    • MockMvc 설정 시 인증을 무시하도록 설정하거나, 기본적인 Header를 추가하여 인증을 흉내내는 방법도 고려해보시면 좋을 것 같습니다.

이러한 변경을 통해 강의 환경 설정에 맞게 인증 없이 테스트가 원활히 이루어질 것으로 예상됩니다.

추가 자료:

이와 같은 인증 문제에 대한 해결 방법을 담은 비슷한 질문들이 있습니다. 아래의 링크를 참조하시면 추가적인 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

질문하기