Spring Boot - การทดสอบหน่วยควบคุมส่วนที่เหลือ

Spring Boot เป็นวิธีง่ายๆในการเขียนไฟล์ Unit Test for Rest Controller ด้วยความช่วยเหลือของ SpringJUnit4ClassRunner และ MockMvc เราสามารถสร้างบริบทเว็บแอปพลิเคชันเพื่อเขียนไฟล์ Unit Test for Rest Controller

การทดสอบหน่วยควรเขียนไว้ใต้ src/test/java ไดเร็กทอรีและทรัพยากร classpath สำหรับการเขียนการทดสอบควรอยู่ภายใต้ src/test/resources ไดเรกทอรี

สำหรับการเขียน Unit Test เราจำเป็นต้องเพิ่มการพึ่งพาการทดสอบ Spring Boot Starter ในไฟล์คอนฟิกูเรชันบิลด์ของคุณดังที่แสดงด้านล่าง

<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')

ก่อนที่จะเขียน Test case เราควรสร้างเว็บเซอร์วิส RESTful ก่อน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสร้างเว็บเซอร์วิส RESTful โปรดดูบทที่ให้ไว้ในบทแนะนำนี้

การเขียนแบบทดสอบหน่วยสำหรับ REST Controller

ในส่วนนี้ให้เราดูวิธีการเขียน Unit Test สำหรับ REST Controller

ขั้นแรกเราต้องสร้างไฟล์คลาส Abstract ที่ใช้ในการสร้างบริบทเว็บแอปพลิเคชันโดยใช้ MockMvc และกำหนดเมธอด mapToJson () และ mapFromJson () เพื่อแปลงวัตถุ Java เป็นสตริง JSON และแปลงสตริง JSON เป็นวัตถุ Java

package com.tutorialspoint.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 และเขียน Unit Test สำหรับแต่ละวิธีเช่น GET, POST, PUT และ DELETE

รหัสสำหรับ GET API Test case ได้รับด้านล่าง 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");
}

รหัสสำหรับกรณีการทดสอบ 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, status);
   String content = mvcResult.getResponse().getContentAsString();
   assertEquals(content, "Product is deleted successsfully");
}

ไฟล์คลาสการทดสอบคอนโทรลเลอร์แบบเต็มมีให้ด้านล่าง -

package com.tutorialspoint.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.tutorialspoint.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, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "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, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "Product is deleted successsfully");
   }
}

คุณสามารถสร้างไฟล์ JAR ที่ปฏิบัติการได้และเรียกใช้แอปพลิเคชัน Spring Boot โดยใช้คำสั่ง Maven หรือ Gradle ที่ระบุด้านล่าง -

สำหรับ Maven คุณสามารถใช้คำสั่งด้านล่าง -

mvn clean install

ตอนนี้คุณสามารถดูผลการทดสอบได้ในหน้าต่างคอนโซล

สำหรับ Gradle คุณสามารถใช้คำสั่งดังที่แสดงด้านล่าง -

gradle clean build

คุณสามารถดูผลลัพธ์ที่เหลือได้ในหน้าต่างคอนโซลดังที่แสดงด้านล่าง