Spring Boot提供了一种为Rest Controller文件编写单元测试的简便方法。在SpringJUnit4ClassRunner和MockMvc的帮助下,可以创建一个Web应用程序上下文来为Rest Controller文件编写单元测试。
单元测试应该写在src/test/java目录下,用于编写测试的类路径资源应该放在src/test/resources目录下。
对于编写单元测试,需要在构建配置文件中添加Spring Boot Starter Test依赖项,如下所示。
1 2 3 4 5 | < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-test</ artifactId > < scope >test</ scope > </ dependency > |
XML
Gradle用户可以在build.gradle 文件中添加以下依赖项。
1 | testCompile(‘org.springframework.boot:spring-boot-starter- test ‘) |
在编写测试用例之前,应该先构建RESTful Web服务。 有关构建RESTful Web服务的更多信息,请参阅本教程中给出的相同章节。
编写REST控制器的单元测试
在本节中,看看如何为REST控制器编写单元测试。
首先,需要创建用于通过使用MockMvc创建Web应用程序上下文的Abstract类文件,并定义mapToJson()和mapFromJson()方法以将Java对象转换为JSON字符串并将JSON字符串转换为Java对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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用于查看产品列表。
1 2 3 4 5 6 7 8 9 10 11 12 | @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用于创建产品。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @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用于更新现有产品。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @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将删除现有产品。
1 2 3 4 5 6 7 8 9 | @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" ); } |
完整的控制器测试类文件代码如下 -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | 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 , 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文件,并使用下面给出的Maven或Gradle命令运行Spring Boot应用程序 -
对于Maven,可以使用下面给出的命令
mvn clean install
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/182062/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)