[BoostCourse] 테스트 코드 만들기

 * 더 정리가 필요

이 글은 테스트 코드 없이 손으로 그림그려가면서 코딩하는 부족한 날 위한 글

 

 - 사전내용

바쁘다는 핑계로 프로젝트를 뒤로 미루다가 다시 하려니 생각이 잘 안나고.. 리펙토링 해야 할 부분도 많고, 답도 안나오고...
몇 개월전에 『테스트 주도 개발(Test-Driven Development: By Example)』이란 책을 읽고,
내게 부족한 부분을 채워줄 수 있을 것 같아서 흉내내 보았다.

 

 이 글을 쓰는 시점은 PJT 4까지 완료하고 5개월이 지나고 PJT 5를 다시 시작하려한다.
 - 목표
1. src/test/java 폴더에 class 파일 만들기
2. 테스트 클래스에 Annotation 적용하기
3. @Test Annotation을 적용한 테스트 메서드 만들기
4. Controller에 @Mockito 적용하여 API 테스트 작성

 

 - 기존 테스트 코드

기존에도 소스 내에 print()만 안찍었지 비슷한 수준의 테스트 클래스를 작성하여 흉내만 냈었다.

 

 

 - 카테고리 (/api/categories) 결과 값

 

 

위와 같은 자바 클래스를 Repository, Service까지는 대충 적용 되는 것처럼 보인다.
물론 테스트 코드에 대한 개념과 깊이가 없어 데이터를 출력해보는 것 이상의 정보는 보이지 않는다.

 


 

여기서부터가 문제인데 웹 프로젝트에서 request 값이 정상적으로 요청이 들어와
Service Layer, Repository Layer의 함수를 호출하는 것은

단순하게 함수를 호출하여 결과 값이 내가 만든 결과 값이 나오는지 확인이 가능하다.

Controller도 기존에 만들었던 똑같은 테스트 방식으로 파라미터 넣고 호출하도록 했었다.

 

하지만 Controller의 목적은 Model과 View간에 상호 동작을 관리 하는 것이다.

즉, View에서 request한 값을 받아 Model에 전해주고, Model의 결과 값을 View에 전달해주는 것

 

지금처럼 테스트 하면 View에서 request한 값을 받을 수 있는 방법이 없다.

 

그래서 적용한 것이 Mockito이다.

 

 - dependency 추가

spring-test, junit은 기존에 쓰고 있었고, mockito-all만 새로추가

 

 - Controller 테스트 코드

 

 - Mockito 적용 전 참고해야할 설정

web.xml에 설정되어 있는 servlet 설정

AnnotationConfigWebApplicationContext - DispatcherServlet에게 annotation 기반의 자바 설정 로드
WebMvcContextConfiguration - 자바 베이스 스프링 설정

 

 

 - 상단 어노테이션 설정

@RunWith docs

 - 스프링 테스트를 Junit으로 돌리기 위한 어노테이션 

 

@ContextConfiguration docs

 - ApplicationConfig.class, WebMvcContextConfiguration.class를 spring context의 빈 설정 파일로 사용

 * contextConfigLocation로 사용하고 있는 클래스인 WebMvcContextConfiguration 클래스를 @ContextConfiguration에 추가 안하면 Dispatcher가 URL를 매핑할 controller를 찾지못한다.

 

@WebAppConfiguration docs

 - 테스트할 DI 컨테이너를 웹 어플리케이션 전용 DI 컨테이너로 처리

 

위에 내용이 설정되어야 Test 클래스에서 스프링 MVC 동작을 재현할 수 있다.

 

 - MockMvc 선언

  • MockitoAnnotations.iniMocks()
    • @Mock, @Spy, @Captor, @InjectMocks이설정된 객체를 초기화 해준다.
  • MockMvc
    • MockMvc로 초기화된 DispatcherServlet 인스턴스를 반환한다.
  • MockMvcBuilders.webAppContextSetup(WebApplicationContext context)
    • DisplatcherServlet은 스프링 MVC기반 구조와 응용프로그램 컨트롤러를 찾아 ServletContext로 설정된 Context를 사용하도록 한다.
  • MockMvcBuilders.standaloneSetup(Object... controllers)
    • 하나 이상의 @Controller 인스턴스를 등록하거나 스프링 MVC 인프라를 프로그래밍적인 설정을 통해 MockMvc를 빌드한다.

 

 

 - Mock 객체 선언

  • @Mock
    • 테스트에 필요한 객체를 신속하게 생성할 수 있다.
    • 반복적인 모의 생성 코드를 최소하 하도록 한다.
    • 테스트 클래스를 읽기 쉽게 만든다.
    • 필드 이름이 Mock을 식별하는데 사용되어 확인된 오류를 읽기 쉽게 만들어준다.
  • @InjectMock
    • class의 인스턴스를 생성하고 @Mock(또는 @Spy) Annotation으로 생성된 mock instance를 class의 instance에 주입한다.
    • 이 mock instance를 초기화하고 주입하려 @RunWit(MockitoJunitRunner.class) 또는 MockitoAnnotations.init(this)를 사용해야 한다. 

 

 - 테스트에 필요한 static factory 메서드

static factory 메서드 설명
MockMvcRequestBuilders  요청 데이터를 설정할 때 사용할 static 메서드
MockMvcResultMatchers 
실행 결과를 검증할 때 사용할 static 메서드
MockMvcResultHandlers 
실행 결과를 로그 등으로 출력할 때 사용할 static 메서드

 

 - Mockito로 카테고리 API(get: /api/categories) 테스트 코드

 

 

 - Mockito로 카테고리 API(get: /api/categories) 테스트 결과 값

 

 

 - Mockito로 예약 API(get: /api/reservations) 테스트코드

 

 

 - Mockito로 예약 API(get: /api/reservations) 테스트 결과 값

 

 

 - 데이터 결과 값을 Json Viewer를 통해 데이터 확인

 

참고 사이트

 - MockMvc

 - MockitoAnnotations.init()

 - MockitoAnnotations.initMocks() vs @RunWith(MockitoJunitRunner.class)

 - JsonViewer

 

+ Recent posts