Spring Test - @WithMockUser, @WithAnonymousUser

목차

Controller

@RestController
public class HelloController {

@GetMapping("/hello")
public String hello(){
return new String("hello");
}
}

@WithMockUser

@WithMockUser 는 Security Test 를 진행할 때 인증된 Authentication 객체를 만들어 인증된 상태로 Test 를 진행할 수 있게 도와준다.

  • 속성
    • username : Authentication 객체에서 사용할 username 을 설정
    • password : Authentication 객체에서 사용할 password 을 설정
    • roles : Authentication 객체에서 사용할 role 을 설정
    • authorities : Authentication 객체에서 사용할 authorities 을 설정
@WebMvcTest
@AutoConfigureMockMvc
class HelloControllerTest {
@Autowired
MockMvc mockMvc;

@Test
@WithMockUser(username = "user", password = "1234")
void mockUserTest() throws Exception {
mockMvc.perform(get("/hello"))
.andDo(print())
.andExpect(status().isOk());
}
}

@WithMockUser 권한 사용 하기

Security Config 추가하기

Resource 에 각각 다른 권한 별로 접근이 가능하도록 설정한다.

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/hello").hasRole("USER")
.antMatchers("/manager").hasRole("MANAGER")
.anyRequest()
.authenticated();
}

Controller 추가

@GetMapping("/manager")
public String manager(){
return "Hello Manager";
}

테스트 코드 작성

@WithMockUser 를 통해 생성된 Authentication 객체는 role 이 USER 기 때문에 MANAGER 권한이 필요한 resource 에는 접근할 수 없다.

@Test
@WithMockUser(username = "user", password = "1234", roles = "USER")
void mockManagerTest() throws Exception {
mockMvc.perform(get("/manager"))
.andDo(print())
.andExpect(status().isForbidden());
}

@WithAnonymousUser

@WithAnonymousUser 는 anonymous 사용자로 테스트를 진행한다.

@Test
@WithAnonymousUser
void mockAnonymousUserTest() throws Exception {
mockMvc.perform(get("/hello"))
.andDo(print())
.andExpect(status().isForbidden());
}
Share