Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- annotation
- IdClass
- javaspring
- secondaryindex
- 자바스프링
- markerinterface
- AWS
- 로드밸런서
- compositekey
- awscloud
- Springsecurity
- 테스트코드
- Spring
- partiql
- 다이나모디비
- 오류
- 스프링
- filterexpression
- Route53
- EmbeddedId
- 도메인
- DynamoDB
- 스프링테스트
- 개발
- testresttemplate
- awscli
- query
- MockMvc
- Java
- 자바
Archives
- Today
- Total
아장아장 개발 일기
Spring MockMvc와 TestRestTemplate 비교 본문
mvc 구조로 이뤄진 프로젝트의 경우 mockMvc 템플릿을 사용해 테스트를 진행할 수 있습니다. mockMvc를 사용하기 전에 TestRestTemplate을 사용해 테스트를 시도했는데 spring security config때문에 로그인 페이지에서 302 에러가 표시되었습니다.
정확히 스프링 시큐리티의 httpSecurity configure의 loginform과 antMatcher로 권한 필터링하는 소스가 테스트하려는 소스로의 진입을 막는 것으로 파악했습니다. 이는 mockMvc 템플릿의 @WithMockUser, @WithUserDetails등의 어노테이션을 사용해 해결될 수 있습니다.
그렇다면 여기서 ‘TestRestTemplate을 @WithMockUser 혹은 @WithUserDetails와 함께 사용할 수 없나?’ 라는 의문이 생기는데, 아래는 둘을 같이 사용할 수 없는 이유입니다. 저도 실제로 테스트 코드를 짜면서 restTemplate의 302 오류를 두 어노테이션으로 해결하려고 했으나 결국 안된다는 결론을 내렸습니다.
- @WithMockUser는 스레드 기반인데, MockMvc와 TestRestTemplate은 서로 다른 스레드 모델을 가짐.
- MockMvc를 사용하면, HTTP 레이어와 servlet 컨테이너가 가짜로 생성되고, 테스트의 요청이 스프링 MVC의 dispatcher servlet의 동일한 스레드로 바로 전달. → @WithMockUser 어노테이션 사용 가능
- TestRestTemplate을 사용한다는 것은 완전하게 구성된 http 요청을 보내는 것을 의미. 보내진 요청은 테스트가 실행 중인 스레드로 보내지고, 서버의 다른 스레드가 처리. 이 경우, mock user를 설정하고 요청을 보낸 스레드와 실제로 요청을 처리하는 스레드가 다르기 때문에 mock user를 사용할 수 없음.
즉, spring security가 설정된 프로젝트는 mockMVC를 사용해 테스트하는 것이 가장 편리한 방법인 것 같습니다.
출처 :
WithMockUser only works with MockMvcBuilders but not TestRestTemplate?
'개발 > Spring' 카테고리의 다른 글
Jar 파일 PathNotFound 오류 해결 방법 (0) | 2022.10.21 |
---|---|
@Component VS @Service VS @Repository 어노테이션 차이 (0) | 2022.08.18 |
Spring Security ‘hasAnyAuthority()’ VS ‘hasAnyRole()’ (0) | 2022.04.21 |
Spring MockMvc 사용법 (0) | 2022.04.19 |
Lombok Builder로 초기값 세팅하기 (0) | 2022.04.01 |
Comments