-
JUnit에서 Controller 테스트 코드 작성하기(정리)웹 개발/Spring Framework 2018. 6. 18. 13:46
많은 부분을 참조한 출처: http://thswave.github.io/java/2015/03/02/spring-mvc-test.html
맨 먼저 환경설정.
JUnit을 위한 기본적인 환경설정이 돼있다는 전제 하에
Mock 디펜던시가 필요하다.
아래 소스를 추가.
123456<dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.10.19</version><scope>test</scope></dependency>cs 컨트롤러 테스트는 서비스와 잘 연결됐는지 확인만 해주면 되기 때문에
데이터를 받아오는 것까진 굳이 확인해줄 필요없다.
(하는 부분까지 데이터를 받는 게 되지도 않았지만..)
비즈니스 로직은 Service와 DAO에서 확인하면 될 것이다.
먼저, 전체소스부터 보여주고 차례로 정리해보겠다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990@Transactional@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"file:src/main/resources/config/spring/context-*.xml"})public class PracticeControllerTest {private static final Logger logger = LoggerFactory.getLogger(PracticeControllerTest.class);@MockSecondTesteService secondTestService;@MockFirstTestService firstTestService;@InjectMocksprivate PracticeTestController practiceTestController;private MockMvc mockMvc;private LoginDTO loginDTO;private Map<String, Object> params;private ModelAndView mv;public MockHttpSession session;public MockHttpServletRequest request;@Beforepublic void setUp() throws Exception {searchParamVO = new SearchParamVO();params = new HashMap<>();mv = new ModelAndView();loginDTO = new LoginDTO();loginDTO.setGroupSeq("zorbaGroup");loginDTO.setCompSeq("zorbaCompany");loginDTO.setEmpSeq("1234");session = new MockHttpSession();session.setAttribute("loginDTO", loginDTO);request = new MockHttpServletRequest();request.setSession(session);RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));MockitoAnnotations.initMocks(this);mockMvc = MockMvcBuilders.standaloneSetup(practiceTestController).build();}/** 테스트 페이지 뷰* */@Testpublic void testChocolateView() throws Exception {Map<String, Object> paramMap = new HashMap<>();paramMap.put("loginDTO", loginDTO);mockMvc.perform(get("/test/view").session(session)).andExpect(status().isOk()).andExpect(view().name("/test/view/chocolate.jsp"));verify(secondTestService).getOPTION(paramMap);mv = practiceTestController.ChocolateView(searchParamVO, params, request);assertTrue(mv.getModel().containsKey("optionA")); // return 됐을 때 해당 키를 포함하고 있는지 확인assertTrue(mv.getModel().containsKey("optionB"));assertTrue(mv.getModel().containsKey("loginDTO"));verify(secondTestService, times(1)).getOPTION(paramMap);verify(secondTestService, atLeastOnce()).getOPTION(paramMap);}/** 테스트 리스트 조회* */@Testpublic void testGetChocolateList() throws Exception {mockMvc.perform(get("/test/getChocolateList").session(session)).andExpect(status().isOk()) // 상태 200이 되는지 검증.andExpect(view().name("jsonView")); // 심어준 뷰 검증mv = practiceTestController.GetChocolateList(params, request);verify(firstTestService).GetChocolateList(params); // 컨트롤러와 잘 연동되는지 검증verify(firstTestService, times(1)).GetChocolateList(params); // 몇 번 호출되는지 검증verify(firstTestService, atLeastOnce()).GetChocolateList(params); // 최소한 1번 이상 수행 검증}}cs 이제부터 하나하나씩 뜯어보겠다.
12345678@MockSecondTesteService secondTestService;@MockFirstTestService firstTestService;@InjectMocksprivate PracticeTestController practiceTestController;cs @Mock과 @InjectMocks이다.
@InjectMocks에 선언된 컨트롤러에 @Mock에 선언된 Service를 빈으로 주입한다.
1234567891011121314151617181920public MockHttpSession session;public MockHttpServletRequest request;@Beforepublic void setUp() throws Exception {searchParamVO = new SearchParamVO();params = new HashMap<>();mv = new ModelAndView();loginDTO = new LoginDTO();loginDTO.setGroupSeq("zorbaGroup");loginDTO.setCompSeq("zorbaCompany");loginDTO.setEmpSeq("1234");session = new MockHttpSession();session.setAttribute("loginDTO", loginDTO);request = new MockHttpServletRequest();request.setSession(session);RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));cs Mock세션을 만드는 것은 여기 참조.
123MockitoAnnotations.initMocks(this);mockMvc = MockMvcBuilders.standaloneSetup(practiceTestController).build();cs MOckitoAnnotations.initMocks(this)이 @Autowired 역할을 수행한다.
standaloneSetup은 컨트롤러를 MockMvc 객체로 등록해준다.
12mockMvc.perform(get("/test/view").session(session)).andExpect(status().isOk()).andExpect(view().name("/test/view/chocolate.jsp"));cs get방식으로 request를 요청한 것이다.
.perform()을 이용하면 매핑url로 request한다. request에서 session을 심어주고 싶다면
.session으로 해서 담아주면 되고,
.andExpect를 이용해서 다양하게 검증할 수 있다.
status().isOk()는 상태가 200번을 내뱉는지, 400번 에러를 뱉는지 체크할 수 있고,
내가 담아주려한 view에 정확하게 담겼는지 확인할 수 있다. (그 외에도 다양한 검증방법이 있으니 찾아보면 됨)
12345mv = practiceTestController.ChocolateView(searchParamVO, params, request);assertTrue(mv.getModel().containsKey("optionA")); // return 됐을 때 해당 키를 포함하고 있는지 확인assertTrue(mv.getModel().containsKey("optionB"));assertTrue(mv.getModel().containsKey("loginDTO"));cs Map형식으로 ModealAndView를 리턴할 때 해당 키를 포함하고 있는지 체크하는 방법이다.
ModelAndView.getModel().contatinsKey() 활용
12verify(secondTestService, times(1)).getOPTION(paramMap);verify(secondTestService, atLeastOnce()).getOPTION(paramMap);cs verify()는 서비스가 컨트롤러에 잘 연동되고 동작하는지 검증하기 위한 메서드로 사용했다.time(int 값)은 컨트롤러에서 해당 메서드를 몇 번 수행하는지 체크하기 위함이다.verify(secondTestService, atLeastOnce()) 에서 atLeastOnce()는메서드가 한 번 이상 수행했는지 검증해준다.동작하는지 안하는지만 보고 싶다면 atLeastOnce만 검증해도 될 것 같다.컨트롤러 테스트 끝~'웹 개발 > Spring Framework' 카테고리의 다른 글
@Transactional(선언적 트랜잭션) bean Id 지정해서 사용하기 (0) 2018.06.28 이클립스(Eclipse) 설정 내보내기/가져오기 방법 (0) 2018.06.27 JUnit에서 세션 생성을 어떻게 해야할까?(JUnit에서 session 처리) (0) 2018.05.23 JUnit 테스트 무시하고 싶은 클래스, 메서드 처리 방법 (0) 2018.05.18 [Spring] log4j 설정하기(공유) (0) 2018.05.08