해결된 질문
작성
·
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
안녕하세요!
요거 확인이 늦었네요!
전달주신 코드를 보니 강의내에서 사용되는 버전과 상이한것으로 보여서요, 먼저 강의자료내에서 사용된 버전과 동일하게 맞춰보시겠어요?
아이고! 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")
...
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 이부분 만 추가해줬는데 왜 통과되는거에요? 혹시 서비스에서 거쳐서 레파지토리를 호출하는것이 아니라 레파지토리에서 직접 호출하기 때문에 결과가 같은건가요?
요게 통합테스트로 컨텍스트(service, repository등)를 다 띄우려고하는데 repository에서 사용되는 client를 로드해서 호출할때 인증관련 오류가 발생하는것으로 보입니다! 마지막에 말씀주신 service는 거치긴합니다.
현재 테스트내의 관심사가 아니기때문에 repository계층을 mocking해서 처리하는방식으로 시도해본거라고 보시면 될것같아요~
0
안녕하세요, 인프런 AI 인턴입니다. zzzzz님,
현재 발생하고 있는 401 CLIENT_ERROR
는 인증 문제와 관련된 에러입니다. 강의에서는 로그인 기능을 다루지 않기 때문에, 바로 인증 설정을 변경하여 테스트를 통과시키는 방법을 안내드리겠습니다.
Spring Security 비활성화:
@SpringBootTest
로 통합 테스트를 진행 중이라면, 보안 설정을 일시적으로 비활성화하는 방법이 유효할 수 있습니다.SecurityConfig
파일 수정:
SecurityConfig
라는 설정 파일이 존재한다면, 아래와 같은 코드로 보안을 비활성화할 수 있습니다.@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests().anyRequest().permitAll(); // 모든 요청을 인증 없이 허용
}
}
프로파일을 사용하여 테스트 시 보안 설정 무시:
application-test.properties
또는 application-test.yml
파일을 생성하여 테스트 시 특정 Security 설정을 무시하도록 프로파일을 활용하는 방법도 있습니다.테스트 메서드에서 MockMvc 설정 변경:
MockMvc
설정 시 인증을 무시하도록 설정하거나, 기본적인 Header를 추가하여 인증을 흉내내는 방법도 고려해보시면 좋을 것 같습니다.이러한 변경을 통해 강의 환경 설정에 맞게 인증 없이 테스트가 원활히 이루어질 것으로 예상됩니다.
이와 같은 인증 문제에 대한 해결 방법을 담은 비슷한 질문들이 있습니다. 아래의 링크를 참조하시면 추가적인 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요. 위와 같이 강의 버전과 동일하게 했으나 동일한 에러가 조회됩니다. pc가 문제인지 알아서 pc 방 pc에서 인텔리제이 깔아서 실행해도 동일합니다.