본문 바로가기

Spring

JUnit을 이용한 Spring Controller Test


프로젝트를 위해 스프링을 간단한 컨트롤러와 서비스 클래스를 만들어보았다.
스프링은 책으로만 보았지, 직접 사용해보긴 처음이라.. 감 좀 잡고 싶어서....

2.5.2 버젼을 사용하기 때문에 어노테이션을 활용해 보았다.

@Controller
public class BaseController {

 Log logger = LogFactory.getLog(BaseController.class); 
 
 SearchService ss = null;
 
 @Autowired
 public void setSearchService(SearchService ss) {
  this.ss = ss;
 }
 
 @RequestMapping("/search.gs")
 public String search(HttpServletRequest request, HttpServletResponse response) {
  logger.debug("controll.....");
  logger.info("검색어 : " + request.getParameter("keyword"));
  ss.search();
  
  ModelAndView mv = new ModelAndView();
  mv.setViewName("searchResult");
  
  return request.getParameter("keyword");
 }
}



앞 포스트에도 있는 건데 별건 없고 그냥 검색어 받아서 검색 해주는 척~~~ 하는 서비스를 가지고 있는 Control 이다. 어노테이션을 사용했고, xml에는 패키지 스캔을 하도록 설정해 주었다.

public class SearchServiceImpl implements SearchService {

 Log logger = LogFactory.getLog(SearchServiceImpl.class); 
 
 @Override
 public String search() {
  // Search document by lucene
  logger.debug("search....");
  
  return "검색결과 입니다.";
 }

}




이녀석이 검색하는 척~~~ 하는 녀석이다.

이렇게 해서 페이지는 뜨는데... 저것을 테스트 할 수 있는 클래스를 한번 만들어 보고 싶었다.

그래서 간단하게 하나 만들어 봤는데..

@Test
public class BaseControllerTest extends TestCase {
 Log logger = LogFactory.getLog(BaseControllerTest.class);
 
 private BaseController baseController = null;
  
 @Override
 protected void setUp() throws Exception {
  baseController = new BaseController();
  logger.debug("setup");
 }
 
 @Test
 public void testController() {
  MockHttpServletRequest request = new MockHttpServletRequest();
  MockHttpServletResponse response = new MockHttpServletResponse();
  
  request.setParameter("keyword", "나이키");
  
  String result = baseController.search(request, response);
  logger.debug(result);
  
  assertEquals(result,"나이키");
 }
}



그리고 돌려보니 당연이 Exception이 발생한다.. 잠깐 생각해보니.. Controller는 생성 했는데
그 Controller가 사용하는 Service를 바인딩 시켜주지 못 한 거라...

책을 좀 찾아보니 EasyMock 이라는 라이브러리가 있길래 사용해볼까 하다가..
Junit4를 사용한 테스트 라는 것을 보게 되었다.

그래서 작성한 녀석이..

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:config/applicationContext.xml",
 "classpath:actions/action-config.xml",
 "classpath:services/serviceContext-sample.xml" })
 
public class BaseControllerTest {
 Log logger = LogFactory.getLog(BaseControllerTest.class);
 
 @Autowired
 private BaseController baseController = null;
 
 
 @Test
 public void testController() {
  MockHttpServletRequest request = new MockHttpServletRequest();
  MockHttpServletResponse response = new MockHttpServletResponse();
  
  request.setParameter("keyword", "나이키");
  
  String result = baseController.search(request, response);
  logger.debug(result);
  
  assertEquals(result,"나이키");
 }
}



아마 내부적으로는 xml 파일을 사용해 ApplicationContext에 xml에 설정해놓은 POJO 클래스들을 생성하는 것이 아닐까 싶다..

@Autowired를 해놓으면
자동적으로 BaseController와 거기서 사용하는 Service까지 같이 바인딩이 된다.

이로써 테스트 성공~~