日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:133日期:2023-09-18 14:40:12

Spring Boot提供了一種為Rest Controller文件編寫單元測試的簡便方法。在SpringJUnit4ClassRunner和MockMvc的幫助下,可以創(chuàng)建一個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服務的更多信息,請參閱本教程中給出的相同章節(jié)。

編寫REST控制器的單元測試

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

首先,需要創(chuàng)建用于通過使用MockMvc創(chuàng)建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)@WebAppConfigurationpublic 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用于查看產品列表。

@Testpublic 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用于創(chuàng)建產品。

@Testpublic 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用于更新現有產品。

@Testpublic 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將刪除現有產品。

@Testpublic 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 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'); }}

創(chuàng)建一個可執(zhí)行的JAR文件,并使用下面給出的Maven或Gradle命令運行Spring Boot應用程序 -

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

mvn clean install

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区观看| 久久国产乱子精品免费女| 黑人精品一区| 日韩精品午夜| 99成人在线| 中文字幕日本一区二区| 国产精品欧美在线观看| 日本免费一区二区三区四区| 日韩一级欧洲| 欧美精品影院| 秋霞影院一区二区三区| 亚洲一区二区三区高清| 国产日韩高清一区二区三区在线| 福利一区二区三区视频在线观看| 五月天综合网站| 国产麻豆一区| 亚洲欧美伊人| 国产伦精品一区二区三区视频 | 国产日韩欧美一区二区三区| 视频在线不卡免费观看| 国产免费成人| 国产一区二区三区探花| 日韩午夜在线| 精品国产中文字幕第一页| 激情91久久| 麻豆中文一区二区| 99亚洲视频| 精品一区二区三区视频在线播放| 亚洲黄色在线| 精品亚洲二区| 亚洲色图国产| 福利一区二区三区视频在线观看| 日韩影院在线观看| 日韩av在线播放网址| 综合五月婷婷| 久久久777| 国产精品久久免费视频| 亚洲免费观看| 国产66精品| 免费高清在线一区| 国产传媒在线| 日韩1区2区日韩1区2区| 一区二区小说| 精品国产aⅴ| 综合色一区二区| 久久伦理在线| 欧美精品不卡| 亚洲毛片在线免费| 亚洲高清不卡| 成人亚洲精品| 国产乱码精品一区二区三区四区| 国产一区二区精品| 日韩理论片av| 欧美黄色一区| 日本在线一区二区三区| 中文精品在线| 亚洲精品在线影院| 麻豆国产精品| 日韩av一级片| 热久久国产精品| 欧美.日韩.国产.一区.二区| 美女精品视频在线| 青青青国产精品| 日韩精品一级中文字幕精品视频免费观看| 91精品国产91久久久久久黑人| 精品久久久久久久| 日韩一区二区三区四区五区| 在线一区免费观看| 伊人精品一区| 成人日韩在线观看| 国产理论在线| 国产精品hd| 欧美一区网站| 亚欧成人精品| 视频精品一区| 少妇高潮一区二区三区99| 99国产精品自拍| 亚洲成人日韩| 久久一区二区中文字幕| 日本蜜桃在线观看视频| 精品国产一区二区三区噜噜噜| 国产精品嫩草影院在线看| 日韩精品免费视频人成| 中文字幕成人| 亚洲理论在线| 日韩精品亚洲aⅴ在线影院| 蜜臀av国产精品久久久久 | 免费人成在线不卡| 亚洲国产成人精品女人| 激情欧美国产欧美| 国产尤物精品| 黄色成人精品网站| 免费日韩视频| 综合亚洲视频| 日本成人在线不卡视频| 日本电影久久久| 日韩不卡一区二区| 18国产精品| 美日韩一区二区三区| 免费在线成人| а√天堂中文在线资源8| 亚洲欧洲高清| 999国产精品999久久久久久| 欧美精品高清| 一区二区视频欧美| 亚洲一区二区三区久久久| 亚洲精品欧洲| 国产日韩一区二区三区在线播放| 国产精品嫩模av在线| 国产一区二区三区四区大秀| 不卡一二三区| 激情久久婷婷| 免费久久99精品国产自在现线| 综合激情在线| 国产麻豆一区二区三区| 精品久久精品| 亚洲高清成人| 亚洲天堂av资源在线观看| 亚洲专区视频| 久久av资源| 日韩伦理一区| 免费日韩av片| 国产精品美女在线观看直播| 久久电影tv| 欧美精品黄色| 日本一区福利在线| 麻豆视频久久| 亚洲午夜视频| 日日夜夜免费精品视频| 欧美激情视频一区二区三区免费 | 日韩精品一区二区三区免费视频| 97久久中文字幕| 国产专区精品| 亚洲精品小说| 日韩精品视频网站| 捆绑调教日本一区二区三区| 亚洲黄色在线| 国产欧美日韩一区二区三区在线| 在线看片福利| 视频一区中文字幕| 国产欧美日韩视频在线| av资源亚洲| 亚洲欧美日韩国产一区| 国产毛片久久久| 91精品蜜臀一区二区三区在线| 亚洲三级毛片| 精品国产亚洲一区二区三区大结局| 青青青免费在线视频| 亚洲视频二区| 91亚洲一区| 中文字幕日韩高清在线| 久久精品国产一区二区| aa国产精品| 国产精品白丝一区二区三区| 久久理论电影| 国产精品久久久久久久免费软件| 色婷婷狠狠五月综合天色拍| 亚洲三级在线| 日韩欧美不卡| 亚洲三级网址| 蜜桃精品在线| 91嫩草精品| 激情五月色综合国产精品| 91精品国产自产观看在线| 久久久国产亚洲精品| 国产日韩一区二区三免费高清| 欧美肉体xxxx裸体137大胆| 欧美日韩伊人| 亚洲激情中文在线| 国内不卡的一区二区三区中文字幕| 日韩中文字幕1| 日本精品不卡| 国产精品一区二区99| 99在线|亚洲一区二区| 精品视频高潮| 亚洲精品韩国| 九色porny丨国产首页在线| 91精品啪在线观看国产爱臀| 偷拍欧美精品| 欧美日韩在线观看首页| 国产精品香蕉| 手机精品视频在线观看| 欧美日韩精品免费观看视完整| 欧美亚洲福利| 久久午夜精品| 日韩精品一卡| 久久精品资源| 日本不卡的三区四区五区| 婷婷成人基地| 黄色在线观看www| 国产精品亚洲成在人线| 日韩中文字幕亚洲一区二区va在线 | 亚洲午夜黄色| 精品国产鲁一鲁****| 日韩国产在线观看| 亚洲尤物在线| 欧美日一区二区| 97se综合| 精品国产亚洲日本| 日本色综合中文字幕|