레시피 16-3 스프링 MVC 컨트롤러에 대한 단위 테스트 작성하기

umtuk·2022년 1월 28일
0

스프링 MVC 컨트롤러에 대한 단위 테스트 작성하기

과제

스프링 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);
    }
}
profile
https://github.com/umtuk

0개의 댓글