이번 포스팅에서는 controller 파일을 생성 후 was를 실행하지 않고 controller 테스트를 진행해보도록 하겠습니다.

 

먼저 스프링 프레임워크에서 어떤 설정이 필요한지 확인해보겠습니다.

 

스프링 프레임워크에서 controller 파일을 인식시키려면 controller class 위에 @Controller 어노테이션을 작성하면 됩니다.

 

다음으로 이 @Controller 어노테이션을 인식하게 하려면 src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml 파일을 살펴봐야 합니다.

 

아래 그림에 보면 component-scan context를 설정한 부분이 있는데 base-package 속성값에 @Controller 어노테이션을 자동으로 인식시키고자 하는 폴더명을 지정해야 합니다.

 


이제 controller 파일을 생성하고 JSON데이터를 리턴하는 코드를 작성해보도록 하겠습니다.

 

스프링에서 JSON 처리를 하기 위해서는 jackson-databind 라이브러리를 추가해야 합니다.

 

다음과 같이 pom.xml에 추가합니다.

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.12.0</version>
</dependency>

 

그 다음 VO 객체를 만듭니다.

 

다음과 같이 Stock 클래스 파일을 만들겠습니다.

import lombok.Data;

@Data
public class Stock {
	private String code;
	private String name;
}

 

Stock 객체에 종목코드와 종목명을 넣고 JSON으로 리턴하는 클래스 파일을 만들겠습니다.

 

StockController 클래스를 다음과 같이 작성합니다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.kenmiles.hellojarvis.web.entity.Stock;

@Controller
public class StockController {
	
	@RequestMapping("/setVO")
	public @ResponseBody Stock setVO(){
		Stock vo = new Stock();
		vo.setCode("005930");
		vo.setName("삼성전자");
		
		return vo;
	}
	  
}

 

여기서 주의할 점은 리턴타입에 @ResponseBody 어노테이션을 추가해야 한다는 점입니다.

 

위 controller가 정상적으로 실행되는지 확인하기 위해서는 보통 톰캣을 실행해 브라우저 창에 주소를 입력해서 확인합니다.

 

하지만 이번 포스팅에서는 톰캣 실행 없이 controller 파일이 정상 실행되는지 확인해보도록 하겠습니다.

 

톰캣 실행 없이 controller를 테스트하기 위해서 브라우저에서 요청과 응답하는 과정을 대신처리할 수 있는 MockMvc를 이용하겠습니다.

 

다음과 같이 JUnit Test 파일을 생성합니다.

import java.nio.charset.Charset;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.kenmiles.hellojarvis.web.controller.StockController;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class sampleControllerTest {

	private static final Logger logger = LoggerFactory.getLogger(sampleControllerTest.class);

	@Autowired
	StockController stockController;
	
	private MockMvc mockMvc;
	
    private MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
            MediaType.APPLICATION_JSON.getSubtype(),
            Charset.forName("utf8"));

	@Before
	public void setup(){
		mockMvc = MockMvcBuilders.standaloneSetup(stockController).build();
		logger.info("setup......");
	}
	
	@Test
	public void testGetData()throws Exception{
		mockMvc.perform(MockMvcRequestBuilders.get("/setVO")
				.contentType(contentType))
		.andExpect(MockMvcResultMatchers.status().isOk())
		.andDo(MockMvcResultHandlers.print()); 

	}
}

이 코드에서 일반 자바를 테스트할 때와 다른 점은 @WebAppConfiguration 어노테이션을 추가한 것과 servlet-context.xml을 읽도록 하기 위해 WEB-INF/spring 폴더 아래 xml파일을 전부 인식하도록 했다는 점입니다.

 

테스트를 하고자 하는 controller 파일을 @Autowired로 주입하고 해당 객체를 setup메소드에서 mockMvc 객체로 초기화합니다.

 

<Ctrl> + <F11>로 실행하면 다음과 같이 status가 200이 나타나고 Body에 controller 파일에서 리턴한 JSON 값이 표시되어 있는 것을 확인할 수 있습니다.

 

 

+ Recent posts