1. 程式人生 > 程式設計 >Spring Boot Rest控制器單元測試過程解析

Spring Boot Rest控制器單元測試過程解析

Spring Boot提供了一種為Rest Controller檔案編寫單元測試的簡便方法。在SpringJUnit4ClassRunner和MockMvc的幫助下,可以建立一個Web應用程式上下文來為Rest Controller檔案編寫單元測試。
單元測試應該寫在src/test/java目錄下,用於編寫測試的類路徑資源應該放在src/test/resources目錄下。
對於編寫單元測試,需要在構建配置檔案中新增Spring Boot Starter Test依賴項,如下所示。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

XML

Gradle使用者可以在build.gradle 檔案中新增以下依賴項。

testCompile(‘org.springframework.boot:spring-boot-starter-test‘)

在編寫測試用例之前,應該先構建RESTful Web服務。 有關構建RESTful Web服務的更多資訊,請參閱本教程中給出的相同章節。

編寫REST控制器的單元測試

在本節中,看看如何為REST控制器編寫單元測試。

首先,需要建立用於通過使用MockMvc建立Web應用程式上下文的Abstract類檔案,並定義mapToJson()和mapFromJson()方法以將Java物件轉換為JSON字串並將JSON字串轉換為Java物件。

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,"Product is updated successsfully");
}

Delete 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,"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 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,"Product is updated successsfully");
  }
  @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,"Product is deleted successsfully");
  }
}

建立一個可執行的JAR檔案,並使用下面給出的Maven或Gradle命令執行Spring Boot應用程式 -

對於Maven,可以使用下面給出的命令

mvn clean install

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。