본문 바로가기

개발/스프링

스프링4 - WAS 없이 Controller 테스트 하는 방법(jUnit)

서버 사이드 쪽의 소스가 (java파일) 변경되었을 때, 반영이 되려면 그때마다 WAS를 재기동해야 한다.

이번 포스팅은 이런 시간적 불편함을 해결해 주지 않을까 싶다.

테스트 하고 싶은 @RequestMapping에서 로그를 WAS 없이 확인이 가능하기 때문이다.

 

 

*주의사항

 - jUnit은 12버전으로 업데이트 하여야 한다.

 

*요약

1. 메이븐(pom.xml) 설정

2. JSON 형식의 리턴을 위한 VO 만들기

3. jUnit으로 테스트 할 Controller 만들기

4. @RequestMapping 할 Controller 만들기

 

 

 1-1. JAVA 버전, 스프링 버전 업데이트 방법 

아래 포스팅을 참조하세요~~

 

 

스프링4 - Jackson으로 웹에 JSON 형태로 출력하기

현재 개발 프로젝트 실무에서 JSON 형태의 데이터를 활용하지 않는 곳은 거의 없을 것이다. 작년 말 을지로에서 근무했을 때에는, 스프링과 잭슨을 활용하여 RESTFUL API를 제공해 주는 개발을 했었�

choykim.tistory.com

 

 

 1-2. '스프링 테스트' 디펜던시 설정 

<!-- Spring Test -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>${org.springframework-version}</version>
</dependency>

위의 'spring-test 모듈' 라이브러리를 통해서 별도의 WAS 없이도 컨트롤러를 테스트할 수 있는 작업이 가능해진다.

참고로 스프링 3.2 버전부터 jUnit만으로 테스트가 가능하다.

 

 

 1-3. jUnit 설정 

<!-- Test -->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

jUnit 버전은 4.12로 맞춰준다.

 

 

 1-4. servlet 버전 업데이트 

<!-- Servlet without WAS, test -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
</dependency>

servlet 버전을 3.1.0으로 업데이트 해준다. (기본 버전은 2.5)

 

 

 2. VO 만들기 

package com.kkc.vo;

public class ProductVO {

	private String name;
	private double price;
	
	public ProductVO(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public double getPrice() {
		return price;
	}

	@Override
	public String toString() {
		
		return "ProductVO [name=" + name +
				", price=" + price + "]";
	}
}

위와 같이 VO를 만들어준다.

특이사항이 있다면 toString()을 재정의 하였는데, 제대로 출력이 되는지 확인을 위해서다.

 

 

 3. jUnit으로 테스트 할 Controller 만들기 

package com.kkc.test;

import javax.inject.Inject;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

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

	private static final Logger logger = 
			LoggerFactory.getLogger(NoWasControllerTest.class);
	
	@Inject
	private WebApplicationContext wac;
	
	private MockMvc mockMvc;
	
	@Before
	public void setup() {
		this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
		logger.info("setup................");
	}
	
	@Test
	public void testDoA() throws Exception {
		mockMvc.perform(MockMvcRequestBuilders.get("/doJSON"));
	}
}

위처럼 만들면, 톰캣 구동 없이 jUnit으로만 테스트를 할 수 있다.

'mockMvc'는 브라우저에서 요청과 응답을 의미하는 객체로 간주하면 된다고 한다.

마지막 부분의 testDoA 메서드는 "/doJSON" 주소로 매핑되어, 해당 영역이 실행될 것이다.

 

참고로, 이 컨트롤러는 jUnit 테스트를 위해 test 패키지에 위치 하여야 한다(아래 그림).

 

 

 4. @RequestMapping 할 Controller 만들기 

package com.kkc.controller;

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

import com.kkc.vo.ProductVO;

@Controller
public class SampleController5 {

	private static final Logger logger = 
			LoggerFactory.getLogger(SampleController5.class);
	
	@RequestMapping("/doJSON")
	public @ResponseBody ProductVO doJSON() {
		
		logger.info("doJSON called.....................");
		
		ProductVO vo = new ProductVO("샘플상품", 30000);
		logger.info("vo.toString() : " + vo.toString());
		
		return vo;
	}
}

이전 포스팅에서는 HashMap을 리턴했는데, 위에서는 VO 객체를 리턴하고 있다.

(즉, VO 객체도 JSON 형식으로 웹 출력이 가능하다는 뜻이다)

 

 

 화면 출력 

Console 화면을 보면, "/doJSON"이 호출되어, 정상적으로 호출 되었다.

'개발 > 스프링' 카테고리의 다른 글

스프링4 - Jackson으로 웹에 JSON 형태로 출력하기  (0) 2020.08.20