Spring Boot - Rest Controller Unit Test
Spring Boot cung cấp một cách dễ dàng để viết một tệp Unit Test cho Rest Controller. Với sự trợ giúp của SpringJUnit4ClassRunner và MockMvc, chúng ta có thể tạo ngữ cảnh ứng dụng web để viết tệp Unit Test for Rest Controller.
Unit Test nên được viết dưới src/test/java tài nguyên thư mục và classpath để viết bài kiểm tra nên được đặt trong src/test/resources danh mục.
Để Viết một bài kiểm tra đơn vị, chúng tôi cần thêm phần phụ thuộc Kiểm tra khởi động mùa xuân vào tệp cấu hình bản dựng của bạn như được hiển thị bên dưới.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Người dùng Gradle có thể thêm phần phụ thuộc sau vào tệp build.gradle của bạn.
testCompile('org.springframework.boot:spring-boot-starter-test')
Trước khi viết Test case, trước tiên chúng ta nên xây dựng các dịch vụ web RESTful. Để biết thêm thông tin về cách xây dựng các dịch vụ web RESTful, vui lòng tham khảo chương về cùng một trong hướng dẫn này.
Viết bài kiểm tra đơn vị cho bộ điều khiển REST
Trong phần này, chúng ta hãy xem cách viết Unit Test cho Bộ điều khiển REST.
Đầu tiên, chúng ta cần tạo tệp lớp Abstract được sử dụng để tạo ngữ cảnh ứng dụng web bằng cách sử dụng MockMvc và xác định các phương thức mapToJson () và mapFromJson () để chuyển đổi đối tượng Java thành chuỗi JSON và chuyển đổi chuỗi JSON thành đối tượng 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);
}
}
Tiếp theo, viết tệp lớp mở rộng lớp AbstractTest và viết Bài kiểm tra đơn vị cho từng phương thức như GET, POST, PUT và DELETE.
Mã cho GET API Test case được cung cấp bên dưới. API này là để xem danh sách các sản phẩm.
@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);
}
Mã cho trường hợp thử nghiệm POST API được cung cấp bên dưới. API này là để tạo ra một sản phẩm.
@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");
}
Mã cho PUT API Test case được đưa ra bên dưới. API này là để cập nhật sản phẩm hiện có.
@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");
}
Mã cho Xóa trường hợp thử nghiệm API được cung cấp bên dưới. API này sẽ xóa sản phẩm hiện có.
@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");
}
Tệp lớp Kiểm tra Bộ điều khiển đầy đủ được cung cấp bên dưới:
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");
}
}
Bạn có thể tạo tệp JAR thực thi và chạy ứng dụng Spring Boot bằng cách sử dụng lệnh Maven hoặc Gradle được cung cấp bên dưới:
Đối với Maven, bạn có thể sử dụng lệnh dưới đây:
mvn clean install
Bây giờ, bạn có thể xem kết quả kiểm tra trong cửa sổ giao diện điều khiển.
Đối với Gradle, bạn có thể sử dụng lệnh như hình dưới đây:
gradle clean build
Bạn có thể xem kết quả còn lại trong cửa sổ giao diện điều khiển như hình dưới đây.