Testing Controller
매우 간단한 Controller를 테스트 하겠습니다.
앞에서 만든 MultiActionController를 테스트 하는 코드를 작성하겠습니다. 앞에서 작서해준 컨트롤러는 다음과 같이 View이름만 넘겨 주도록 만든 Stub 형태 입니다.
public ModelAndView list(HttpServletRequest request, HttpServletResponse response){
return new ModelAndView("issue/list");
}
이 녀석을 EasyMock과 spring-mock.jar안에 있는 클래스들을 사용하여 테스트 클래스를 만들어서 IssueService로 부터 받아온 List<Issue>를 ModelAndView에 담아서 반환 하도록 구현할 것입니다.
1. 먼저 테스트 클래스를 작성하고 기본적으로 필요한 변수들을 설정합니다.
private IssueController issueController;
private IssueService mockIssueService;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
@Before
public void setUp() {
issueController = new IssueController();
mockIssueService = createMock(IssueService.class);
issueController.setIssueService(mockIssueService);
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
2. 테스트를 작성합니다.
public void testList() {
List<Issue> issueList = new ArrayList<Issue>();
expect(mockIssueService.getAll()).andReturn(issueList);
replay(mockIssueService);
ModelAndView mav = issueController.list(request, response);
assertEquals("issue/list", mav.getViewName());
assertEquals(issueList, mav.getModel().get("issueList"));
verify(mockIssueService);
}
위 테스트는 컨트롤러의 list 메소드에서 반환되는 ModelAndView의 viewName과 "issueList"라는 key로 List<Issue> 객체를 가지고 있는지 확인합니다. 이 때 필요한 IssueService의 행위를 '녹화-> 재생->검사' 하는 작업을 거칩니다.
3. JUnit 테스트를 실행합니다.
list 메소드를 제대로 구현해두지 않았기 때문에 에러가 발생합니다.
4. list 메소드 구현하기
return new ModelAndView("issue/list", "issueList", issueService.getAll());
}
5. 다시 JUnit 테스트 실행