스프링 MVC 프레임워크로 개발한 웹 애플리케이션 컨트롤러를 테스트하기
DispatcherServlet은 스프링 MVC 컨트롤러에 HTTP 요청/응답 객체를 전달하고 컨트롤러는 요청을 처리 후 뷰를 렌더링하기 위해 다시 DispatcherServlet에 요청 객체를 반환
스프링 MVC 컨트롤러를 단위 테스트할 때 가장 중요한 부분이 HTTP 요청/응답 객체를 모방하는 것
스프링은 서블릿 API용 목 객체 세트(MockHttpServletRequest, MockHttpServletResponse, MockHttpSession 등)을 제공하여 웹 컨트롤러의 단위 테스트 지원
스프링 MVC 컨트롤러를 테스트하려면 DispatcherServlet에 올바른 객체가 반환됬는지 확인
스프링에서 기본 제공되는 각종 어설션 유틸리티를 이용하면 객체의 콘텐트를 조사 가능
은행 직원이 계정 번호와 예금액을 입력하는 웹 인터페이스 개발
DepositController 클래스
@Controller
public class DepositController {
private AccountService accountService;
@Autowired
public DepositController(AccountService accountService) {
this.accountService = accountService;
}
@RequestMapping("/deposit.do")
protected String deposit(
@RequestParam("accountNo") String accountNo,
@RequestParam("amount") double amount,
ModelMap model) {
accountService.deposit(accountNo, amount);
model.addAttribute("accountNo", accountNo);
model.addAttribute("balance", accountService.getBalance(accountNo));
return "success";
}
}
이 컨트롤러는 서블릿 API를 직접 다루지 않으므로 단순 자바 클래스처럼 테스트
public class DepositControllerTests {
private static final String TEST_ACCOUNT_NO = "1234";
private static final double TEST_AMOUNT = 50;
private AccountService accountService;
private DepositController depositController;
@Before
public void init() {
accountService = Mockito.mock(AccountService.class);
depositController = new DepositController(accountService);
}
@Test
public void deposit() {
//Setup
Mockito.when(accountService.getBalance(TEST_ACCOUNT_NO)).thenReturn(150.0);
ModelMap model = new ModelMap();
//Execute
String viewName =
depositController.deposit(TEST_ACCOUNT_NO, TEST_AMOUNT, model);
assertEquals(viewName, "success");
assertEquals(model.get("accountNo"), TEST_ACCOUNT_NO);
assertEquals(model.get("balance"), 150.0);
}
}