java 개발 하면서 TDD 많이들 들어 보셨을 겁니다.
또는 Code 의 품질 확보를 위한 방법으로도 junit 을 적용하기도 하구요.
뭐.. 이유야 어찌되었건... 오늘은 spring mvc 로 개발한 controller 에 대해서 test code 를 작성해 보겠습니다.
아래 예제는 Mockito 를 이용해서 작성 하였습니다.
접기
package proto.board.web;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import proto.board.service.BoardContentViewService;
@Controller
public class BoardContentViewController {
private static final Logger logger = LoggerFactory.getLogger(BoardContentViewController.class);
@Autowired
private BoardContentViewService boardContentViewService;
public void setBoardContentViewService(BoardContentViewService boardContentViewService) {
this.boardContentViewService = boardContentViewService;
}
@RequestMapping(value = "/boardContentView")
public String boardContentView(Model model) {
model.addAttribute("val", boardContentViewService.getBoardContentVO() );
return "boardContentView";
}
}
접기
- 다들 아시겠지만, src/test/java 아래 동일 패키지명으로 해서 해당 클래스 뒤에 Test 만 붙히시면 됩니다.
- Model 같은 경우 interface 이기 때문에 initialize 를 하면 오류가 발생 합니다. 그렇다 보니 이넘이 구현체를 가지고 initialize 하시면 오류가 없습니다.
- Controller 에서 @Autowired 를 했기 때문에 따로 service 객체에 대한 setter 를 구현 안했었는데요, 이렇게 하니 Test 에서 service 객체가 null 이라고 계속 오류를 냅니다.
- 그래서 위에서 처럼 setter 를 생성 해서 해결 했습니다. (다른 방법 아시는 분은 공유 부탁 합니다.)
접기
package proto.board.web;
import static org.junit.Assert.*;
import javax.inject.Inject;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.ui.ExtendedModelMap;
import org.springframework.ui.Model;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
import proto.board.domain.BoardContentVO;
import proto.board.service.BoardContentViewService;
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml", "classpath:context/applicationContext-mybatis.xml"})
public class BoardContentViewControllerTest {
@Inject
private ApplicationContext applicationContext;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private AnnotationMethodHandlerAdapter adapter;
private BoardContentViewController controller;
@Mock
private BoardContentViewService boardContentViewService;
@Mock
private BoardContentVO boardContentVO;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
this.request = new MockHttpServletRequest();
this.response = new MockHttpServletResponse();
this.adapter = new AnnotationMethodHandlerAdapter();
this.controller = new BoardContentViewController();
this.controller.setBoardContentViewService(boardContentViewService);
}
@After
public void tearDown() throws Exception {
}
@Test
public void testBoardContentView () throws Exception {
request.setMethod("GET");
request.setRequestURI("/boardContentView");
boardContentVO.setContent("content");
boardContentVO.setDocumentSrl(1234);
boardContentVO.setEmail("sophistlv@nhn.com");
boardContentVO.setNickname("henry");
boardContentVO.setRegdate("20120319121212");
boardContentVO.setTitle("title");
Mockito.when(boardContentViewService.getBoardContentVO()).thenReturn(boardContentVO);
Model model = new ExtendedModelMap();
String view = controller.boardContentView(model);
assertEquals("boardContentView", view);
}
}
접기
접기
<!-- spring framework test 설정 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- mockito -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
접기
※ 예제를 보셔서 아시겠지만 초절정 쉬운 TestCase 작성 내용이였습니다.
이를 기반으로 확장및 응용은 각자의 몫으로 남기겠습니다.