쌓고 쌓다

컨트롤러 테스트 코드 @AuthenticationPrincipal 인증 방법 본문

프로그래밍/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);

    }
}
Comments