[Spring Security] Method Security Test
public boolean write(String contents) {
while (graffitiRepository.getTotalRowCount() >= GRAFFITI_LIMIT_COUNT) {
graffitiRepository.deleteFirstGraffiti();
}
Graffiti graffiti = new Graffiti(contents, securityService.getCurrentMember());
graffitiRepository.add(graffiti);
return true;
}
위 코드는 봄싹 낙서장 서비스의 코드이다. 봄싹 메인 화면에 있는 낙서장은 최대 100개를 유지하며 ROLE_MEMBER 권한을 가지고 있는 사용자(이메일 인증 절차를 거친 기본 회원)라면 누구나 낙서를 추가할 수 있다.
이 코드의 내용 대부분은 단위 테스트로 커버가 가능하다. 하지만 스프링 시큐리티 애노테이션이 제대로 동작하는지는 어떻게 테스트 할 것인가?
@ContextConfiguration(locations = {"/testContext.xml", "/testContext-security.xml"})
@Transactional
public class MethodSecurityTest extends DBUnitSupport{
@Autowired GraffitiService graffitiService;
@Autowired GraffitiRepository graffitiRepository;
@Before
public void login() throws Exception {
insertXmlData("testData.xml");
SecurityContext securityContext = new SecurityContextImpl();
Authentication authentication = new UsernamePasswordAuthenticationToken("whiteship@email.com", "passwd");
securityContext.setAuthentication(authentication);
SecurityContextHolder.setContext(securityContext);
}
@Test
public void methodAuth(){
assertThat(graffitiRepository.getAll().size(), is(0));
graffitiService.write("hi");
assertThat(graffitiRepository.getAll().size(), is(1));
}
@After
public void after(){
SecurityContextHolder.clearContext();
}
}
이런식으로 테스트 할 수 있다.
1. 시큐리티 설정 파일을 테스트에서 만들 AC(ApplicationContext)용 설정에 추가한다.
2. DB에 xml로 작성한 가짜 사용자, 권한 정보를 넣어야 하니까 DBUnit을 편하게 사용할 수 있게 해주는 클래스를 이용한다.
3. 테스트 실행하기 전에 로그인 한다. (SecurityContextHolder에 SecurityContext를 넣는다.)
4. 테스트 실행한 뒤에 로그오프 한다. (SecurityContextHolder를 비워버린다.)