프로그래밍/spring
컨트롤러 테스트 코드 @AuthenticationPrincipal 인증 방법
승민아
2024. 2. 4. 14:06
컨트롤러에 @AuthenticationPrincipal이 있어 테스트 코드를 동작할때 인증이 필요한 상황이 발생했다.
그래서 SecurityContextHolder에 우리의 사용자 정보를 등록할 필요가 있다.
UserDetails Mock 객체를 Authentication에 등록할 필요가 있다.
등록하면 @AuthenticationPrincipal에서 사용자 정보를 꺼내 쓴다.
CommentControllerTest
@WebMvcTest(value = {CommentController.class})
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class CommentControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@MockBean
private CommentService commentService;
@MockBean
private PosterService posterService;
private Member member;
private PrincipalDetails principalDetails;
@BeforeAll
public void beforeAll() {
this.mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.addFilter(new CharacterEncodingFilter("utf-8", true))
.build();
SecurityContext context = SecurityContextHolder.getContext();
member = mock(Member.class);
principalDetails = mock(PrincipalDetails.class);
when(member.getId())
.thenReturn(1L);
when(member.getName())
.thenReturn("name");
when(principalDetails.getMember())
.thenReturn(member);
Authentication authentication = new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities());
context.setAuthentication(authentication);
}
}