른록노트
[Spring] 전자정부프레임워크 JUnit 테스트 코드 작성하기 (3.10) 본문
1. 설명
전자정부프레임워크는 JUnit 테스팅 프레임워크를 사용합니다.
1.1 MockMvc란
Spring 3.2 버전 전까지는 Controller를 객체화하거나 객체주입하고 MockHttpServletRequest, MockHttpServletREsponse를 활용하여 단위 테스트를 작성했습니다.
하지만 Controller 내부에서 쓰이는 많은 annotation 기능과 request 처리 과정의 로직들을 모두 검증/지원하지 못한다는 단점이 있었습니다.(@initBinder, @ModelAttribute, @ExceptionHandler 등…)
Spring 3.2 버전부터는 MockMvc라는 객체로 위의 단점을 보완하여 Spring을 실행시키는 환경을 만들어서 테스트가 가능합니다. (Spring-test 라이브러리에 포함되어 있습니다.)
2. 방법
전자정부프레임워크 샘플 소스 3.10
저는 JUnit 4.12 버전을 사용했습니다.
2.1. 라이브러리 추가
pom.xml 추가
<!-- For Testing -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.maven.artifact.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
WebAppConfiguration을 사용하기 위해 javax.servlet-api도 받아야하는데 전자정보프레임워크 샘플 프로젝트에는 이미 존재합니다.(확인만 하시면 됩니다.)
<dependency> <!-- WebAppConfiguration을 사용하기 위함 -->
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
2.2. 파일 생성
아래 경로에 EgovSampleController.java 파일을 생성합니다.
src/test/java/egovframework/example/sample/web/EgovSampleControllerTest.java
package egovframework.example.sample.web;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class) //JUnit
@WebAppConfiguration
@ContextConfiguration(locations = { "file:src/main/resources/egovframework/spring/*.xml",
"file:src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml" })
public class HomeControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void egovSampleList_테스트() throws Exception {
this.mockMvc.perform(get("/egovSampleList.do").accept(MediaType.parseMediaType("application/html;charset=UTF-8")))
.andExpect(status().isOk());
}
}
2.3. 소스분석
만약 전체 Bean을 주입받으려면 위 코드와 그대로 사용하면됩니다.
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); // 스프링이 주입한 모든 객체 사용
특정 컨트롤러만 주입받아서 테스트하려면 아래와 같이 변경하시면 됩니다.
@Autowired
TestController testController; bean을 주입받아서 테스트하고싶은 Controller만 테스트 할 수 있습니다.
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(testController).build();
}
참고사이트
전자정부프레임워크 mvc_test
Spring document 4.3
Spring Mvc JUnit 관련 글 블로그