Controller test에서 @AuthenticationPrincipal를 통과해야한다!

leverest96·2023년 1월 4일
0

Trouble Shooting

목록 보기
8/20
post-thumbnail

문제 인지

Controller test를 작성하던 도중 이전과는 다르게 인증된 user의 정보를 가져와서 사용해야하는 상황이 발생했다.

문제 원인

@AuthenticationPrincipal로 user 정보를 가져와야하지만 요청에 대한 정보가 존재하지 않으므로 해당 @AuthenticationPrincipal에서 정보를 가져오지 못한다. 따라서, 요청에 대한 정보를 전달해주는 녀석을 먼저 세팅을 해줘야한다.

해결 방법

아래와 같은 resolver를 만들어두고

public final class AuthenticationPrincipalArgumentResolver implements HandlerMethodArgumentResolver {
      private final MemberDetails memberDetails;

    public AuthenticationPrincipalArgumentResolver(final MemberDetails memberDetails) {
        this.memberDetails = memberDetails;
    }

    @Override
    public boolean supportsParameter(final MethodParameter parameter) {
        return MemberDetails.class.isAssignableFrom(parameter.getParameterType());
    }

    @Override
    public Object resolveArgument(final MethodParameter parameter,
                                  final ModelAndViewContainer mavContainer,
                                  final NativeWebRequest webRequest,
                                  final WebDataBinderFactory binderFactory) {
        return memberDetails;
    }
}

해당 test의 MockMvcBuilders에서 CustomArgumentResolvers를 setting해준다.

private MemberDetails memberDetails;

@BeforeEach
void beforeEach() {
    memberDetails = MemberDetails.builder()
            .profileUuid(UUID.randomUUID().toString())
            .build();

    mockMvc = MockMvcBuilders
    
            ...
            
            .setCustomArgumentResolvers(new AuthenticationPrincipalArgumentResolver(memberDetails))
            
            ...
            
            .build();

    ...
}
profile
응애 난 애기 개발자

0개의 댓글