봄 부팅 나머지 컨트롤러 파일에 대한 단위 테스트를 작성하는 쉬운 방법을 제공합니다. SpringJUnit4ClassRunner 및 MockMvc의 도움으로, 당신은 나머지 컨트롤러 파일에 대한 단위 테스트를 작성하는 웹 응용 프로그램 컨텍스트를 생성 할 수 있습니다.
단위 테스트를 작성해야한다 src/test/java
에 배치해야합니다 테스트 클래스 패스 자원을 작성하기위한 디렉토리 src/test/resources
디렉토리.
구성 파일의 구성과 같이 단위 테스트의 준비를 위해, 우리는 봄 부팅 스타터 테스트 종속성을 추가해야합니다.
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
Gradle을 사용자가 할 수 build.gradle 다음 파일 종속성을 추가합니다.
testCompile('org.springframework.boot:spring-boot-starter-test')
테스트 케이스를 작성하기 전에 먼저 RESTful 웹 서비스를 구축해야한다. RESTful 웹 서비스를 구축에 대한 자세한 내용은 주어진이 튜토리얼의 같은 장을 참조하십시오.
기록부 시험을 REST 제어기
이 섹션에서는 REST 컨트롤러에 대한 단위 테스트를 작성하는 방법을 살펴 보자.
첫째, 우리는 MockMvc를 사용하여 추상 웹 응용 프로그램 컨텍스트를 만드는 데 사용되는 클래스 파일을 작성해야하고, 정의 mapToJson()
와 mapFromJson()
방법은 자바 JSON 문자열과 자바 객체로 JSON 문자열 객체로 변환 할 수 있습니다.
package com.yiibai.demo;
import java.io.IOException; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; 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; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = DemoApplication.class) @WebAppConfiguration public abstract class AbstractTest { protected MockMvc mvc; @Autowired WebApplicationContext webApplicationContext; protected void setUp() { mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } protected String mapToJson(Object obj) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.writeValueAsString(obj); } protected <T> T mapFromJson(String json, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException { ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.readValue(json, clazz); } }
다음에, 확장 된 물품 AbstractTest
의 클래스 파일을, 각각의 방법 (예컨대 GET
, POST
, PUT
및 DELETE
) 기록 단위 테스트.
우리는 GET API 테스트 코드 아래에 주어진다. 이 API는 제품의 목록을 확인하는 데 사용됩니다.
@Test
public void getProductsList() throws Exception { String uri = "/products"; MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(uri) .accept(MediaType.APPLICATION_JSON_VALUE)).andReturn(); int status = mvcResult.getResponse().getStatus(); assertEquals(200, status); String content = mvcResult.getResponse().getContentAsString(); Product[] productlist = super.mapFromJson(content, Product[].class); assertTrue(productlist.length > 0); }
POST API 테스트 코드는 다음입니다. 이 API는 제품을 만드는 데 사용됩니다.
@Test
public void createProduct() throws Exception { String uri = "/products"; Product product = new Product(); product.setId("3"); product.setName("Ginger"); String inputJson = super.mapToJson(product); MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri) .contentType(MediaType.APPLICATION_JSON_VALUE).content(inputJson)).andReturn(); int status = mvcResult.getResponse().getStatus(); assertEquals(201, status); String content = mvcResult.getResponse().getContentAsString(); assertEquals(content, "Product is created successfully"); }
우리는 PUT의 API 테스트 코드 아래에 주어진다. 이 API는 기존 제품을 업데이트하는 데 사용됩니다.
@Test
public void updateProduct() throws Exception { String uri = "/products/2"; Product product = new Product(); product.setName("Lemon"); String inputJson = super.mapToJson(product); MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(uri) .contentType(MediaType.APPLICATION_JSON_VALUE).content(inputJson)).andReturn(); int status = mvcResult.getResponse().getStatus(); assertEquals(200, status); String content = mvcResult.getResponse().getContentAsString(); assertEquals(content, "Product is updated successsfully"); }
삭제 API 테스트 코드는 다음입니다. 이 API는 기존 제품을 삭제합니다.
@Test
public void deleteProduct() throws Exception { String uri = "/products/2"; MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.delete(uri)).andReturn(); int status = mvcResult.getResponse().getStatus(); assertEquals(200, status); String content = mvcResult.getResponse().getContentAsString(); assertEquals(content, "Product is deleted successsfully"); }
다음과 같이 전체 테스트 컨트롤러 클래스 파일의 코드입니다 -
package com.yiibai.demo;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import com.yiibai.demo.model.Product; public class ProductServiceControllerTest extends AbstractTest { @Override @Before public void setUp() { super.setUp(); } @Test public void getProductsList() throws Exception { String uri = "/products"; MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(uri) .accept(MediaType.APPLICATION_JSON_VALUE)).andReturn(); int status = mvcResult.getResponse().getStatus(); assertEquals(200, status); String content = mvcResult.getResponse().getContentAsString(); Product[] productlist = super.mapFromJson(content, Product[].class); assertTrue(productlist.length > 0); } @Test public void createProduct() throws Exception { String uri = "/products"; Product product = new Product(); product.setId("3"); product.setName("Ginger"); String inputJson = super.mapToJson(product); MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri) .contentType(MediaType.APPLICATION_JSON_VALUE) .content(inputJson)).andReturn(); int status = mvcResult.getResponse().getStatus(); assertEquals(201, status); String content = mvcResult.getResponse().getContentAsString(); assertEquals(content, "Product is created successfully"); } @Test public void