Skip to content

TestSecurityConfig 사용 가이드

choi-ys edited this page May 20, 2024 · 7 revisions

Test Profiles에서 Mocking된 인증된 사용자 적용을 위한 TestSecurityConfig 사용 가이드

TestSecurityConfig.java

@Import(SecurityConfig.class) // SecurityConfig에 작성된 기본 인증/인가 정책을 따름
public class TestSecurityConfig {
    @MockBean
    private InMemoryUserDetailsManager inMemoryUserDetailsManager; // InMomory 환경에서 Mocking된 인증된 사용자 정보 제공을 위한 UserDetailsService 구현체

    @BeforeTestMethod
    public void securitySetUp() {
        given(inMemoryUserDetailsManager.loadUserByUsername(anyString()))
            .willReturn(testLoginUser()); // SecurityContextHolder에 porkoTestMemberId 이름을 가지는 UserDetails 객체 저장
    }
    
    private LoginUser testLoginUser() {
        return LoginUser.of(1L, "porkoTestMemberId"); // 인증된 사용자 Mock 객체
    }
}

Web layer test classes

  • 인증된 사용자 정보를 필요로 하는 Test Class 아래 설정 적용
    • Class : @Import(TestSecurityConfig.class)
    • Method: @WithUserDetails(value = "porkoTestMemberId", setupBefore = TestExecutionEvent.TEST_EXECUTION)
@DisplayName("Controller:Member")
@Import(TestSecurityConfig.class) // 인증된 사용자 Mock 적용을 위한 TestSecurityConfig 설정 적용
class MemberControllerTest extends MemberControllerTestHelper {
    @Test
    @WithUserDetails(value = "porkoTestMemberId", setupBefore = TestExecutionEvent.TEST_EXECUTION) // SecurityContextHolder에 저장된 porkoTestMemberId의 이름을 가지는 인증된 사용자 Mock 적용
    @DisplayName("me")
    void me() throws Exception {
        get().url("/member/me")
            .expect()
            .ok();
    }
}

@AuthenticationPrincipal을 통해 SecurityContextHolder에 저장된 인증된 사용자 정보 주입

@RestController
@RequiredArgsConstructor
public class MemberController {
    private final MemberService memberService;

    @GetMapping("me")
    ResponseEntity<?> me(@LoginMember Long id) { // SecurityContextHolder에 저장된 인증된 사용자 Mock Principal을 @LoginMember를 통해 주입
        MemberResponse memberResponse = memberService.loadMemberById(id);
        return ResponseEntity.ok(memberResponse);
    }
}