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();
...
}