728x90
mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
// .apply(SecurityMockMvcConfigurers.springSecurity())
.build();
컨트롤러 계층 테스트를 진행하던 중 유저 인증이 없어야 되는 경우를 테스트를 하려고 하니 SpringSecurity와 OAuth2에 의해 막히는 상황이 왔다.
뭐 대충 이런 상황인데..
@WebMvcTest(CommentController.class)
@MockBean(JpaMetamodelMappingContext.class)
class CommentControllerTest {
@Autowired
private MockMvc mockMvc;
OAuth2 인증이 진행되지 않아서 그런지 계속해서 302를 발생시킨다.
사실 해당 상황은 굉장히 간단하게 해결할 수 있다.
mockMvc.perform()을 할 때. with(oauth2 Login())을 함께 보내준다.
ResultActions actions = mockMvc.perform(
post("/comments")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.with(csrf())
.with(oauth2Login()) -> 이렇게 되면 oauth2 인증이 된 상태로 간주한다
.content(content)
);
@WithMockUser 에너테이션을 사용한다.
@Test
@DisplayName("댓글 쓰기 - 비회원일 경우")
@WithMockUser
void postComment_anonymousMember
특정 테스트 메서드에 사용해도 되고 클래스 단위에도 사용해도 된다.
기본적으로 USER의 역할을 가지고 있고, 추가로 더 지정해서 줄 수 도 있다.
이는 가짜로 인증을 진행한 상황으로 만들어주는 것이기 때문에 내가 원하는 상황이 아니다.
왜냐하면 나는 로그인을 진행하지 않았을때, 나오는 상황을 테스트하고 싶기 때문이다.
댓글을 작성할때, 로그인한 상태면 해당 작성자를 사용하고, 로그인을 하지 않았다면 직접 작성한 닉네임을 사용해주고 싶다.
그래서 로그인을 하지 않아도 해당 기능을 이용할 수 있어야 하는데, oauth2에 의해 막힌다.
테스트 환경을 자동으로 구성하게 되면서 내가 설정한 SecurityConfig데로 동작을 하지 않는 것 같다.
그래서 해당 테스트에 대한 환경 구성을 직접하기로 했다.
@Test
@DisplayName("댓글 쓰기 - 비회원일 경우")
void postComment_anonymousMember(WebApplicationContext webApplicationContext) throws Exception {
mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.build();
SpringSecurity와 관련된 설정을 하지 않았기 때문에 SpringSecurity와 관련한 설정이 없는 상태로 실행된다.
이렇게 되면 로그인이 필요하지 않기 때문에, 로그인을 하지 않아도 302가 발생하지 않고 Controller가 동작하게 되어 내가 원하는 데로 테스트를 진행할 수 있게 된다.
728x90
'개발일지 > 돌픽' 카테고리의 다른 글
네이버 무료 검색 API 이용해보기 (0) | 2023.05.01 |
---|---|
Google Custom Search API 사용해보기 (0) | 2023.04.30 |
Querydsl .orderBy() (0) | 2023.04.27 |
MySql 랜덤 정렬 (0) | 2023.04.25 |
도메인 별로 enum 관리 (0) | 2023.04.19 |