강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của fpahsqlcj6392
fpahsqlcj6392

câu hỏi đã được viết

Hướng dẫn đầy đủ về lựa chọn nhiệm vụ của nhà phát triển máy chủ - Phần 1

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

Đã giải quyết

Viết

·

89

·

Đã chỉnh sửa

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 파일 등을 수정하라는 안내를 봤습니다. 다만, 현재 수강 중인 강의에는 로그인 기능이 없는 상황입니다.

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

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

감사합니다.

 

javaspringspring-bootdatabase

Câu trả lời 2

0

J Tech님의 프로필 이미지
J Tech
Người chia sẻ kiến thức

안녕하세요!

요거 확인이 늦었네요!

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

zzzzz님의 프로필 이미지
zzzzz
Người đặt câu hỏi

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
Người chia sẻ kiến thức

아이고! 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
Người đặt câu hỏi

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
Người chia sẻ kiến thức

요게 통합테스트로 컨텍스트(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를 추가하여 인증을 흉내내는 방법도 고려해보시면 좋을 것 같습니다.

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

추가 자료:

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

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

Hình ảnh hồ sơ của fpahsqlcj6392
fpahsqlcj6392

câu hỏi đã được viết

Đặt câu hỏi