日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 架構(gòu)師社區(qū)
[導讀]本章節(jié)主要講解兩部分內(nèi)容:1、Mock 測試簡介;2、測試用例演示。

作者:alanshelby

來源:zhuanlan.zhihu.com/p/43260823

「一、前言」

在前面的章節(jié)我們介紹過 Junit 的使用,也了解過 spring-test,今天我們來了解一個新玩意 -- mock 測試。這里僅僅做一個入門,對返回視圖和返回 Json 數(shù)據(jù)的方法進行測試演示,不會把所有的方法都介紹到,具體文檔詳見鏈接:Mock Test,本章節(jié)主要講解以下兩部分內(nèi)容:

1、Mock 測試簡介

2、測試用例演示

二、Mock 測試簡介

1、什么是 mock 測試

在測試過程中,對于某些不容易構(gòu)造或者不容易獲取的對象,用一個「虛擬的對象」來創(chuàng)建以便測試的測試方法,就是 「mock 測試」在測試過程中,對于某些不容易構(gòu)造或者不容易獲取的對象,用一個「虛擬的對象」來創(chuàng)建以便測試的測試方法,就是mock 測試。

  • 虛擬的對象就是 mock 對象。
  • mock 對象就是真實對象在調(diào)試期間的代替品。

2、為什么使用 mock 測試

  • 避免開發(fā)模塊之間的耦合
  • 輕量、簡單、靈活

3、MockMVC 介紹

基于 RESTful 風格的 SpringMVC 的測試,我們可以測試完整的 Spring MVC 流程,即從 URL 請求到控制器處理,再到視圖渲染都可以測試。

1)MockMvcBuilder

MockMvcBuilder 是用來構(gòu)造 MockMvc 的構(gòu)造器,其主要有兩個實現(xiàn):StandaloneMockMvcBuilder 和 DefaultMockMvcBuilder,對于我們來說直接使用「靜態(tài)工廠 MockMvcBuilders 創(chuàng)建」即可。

2)MockMvcBuilders

負責創(chuàng)建 MockMvcBuilder 對象,有兩種創(chuàng)建方式:

standaloneSetup(Object... controllers):通過參數(shù)指定一組控制器,這樣就不需要從上下文獲取了。

「webAppContextSetup」(WebApplicationContext wac):指定 WebApplicationContext,將會從該上下文獲取相應的控制器并得到相應的 MockMvc,本章節(jié)下面測試用例均使用這種方式創(chuàng)建 MockMvcBuilder 對象。

3)MockMvc

對于服務器端的 SpringMVC 測試支持主入口點。通過 MockMvcBuilder 構(gòu)造 MockMvcBuilder 由 MockMvcBuilders 建造者的靜態(tài)方法去建造。

核心方法:perform(RequestBuilder rb) -- 執(zhí)行一個 RequestBuilder 請求,會自動執(zhí)行 SpringMVC 的流程并映射到相應的控制器執(zhí)行處理,該方法的返回值是一個 ResultActions。

4)ResultActions

(1)「andExpect」:添加 ResultMatcher 驗證規(guī)則,驗證控制器執(zhí)行完成后結(jié)果是否正確;

(2)「andDo」:添加 ResultHandler 結(jié)果處理器,比如調(diào)試時打印結(jié)果到控制臺;

(3)「andReturn」:最后返回相應的 「MvcResult」;然后進行自定義驗證 / 進行下一步的異步處理;

5)MockMvcRequestBuilders

用來構(gòu)建請求的,其主要有兩個子類 「MockHttpServletRequestBuilder *和」 MockMultipartHttpServletRequestBuilder*(如文件上傳使用),即用來 Mock 客戶端請求需要的所有數(shù)據(jù)。

6)MockMvcResultMatchers

(1)用來匹配執(zhí)行完請求后的「結(jié)果驗證」

(2)如果匹配失敗將拋出相應的異常

(3)包含了很多驗證 API 方法

7)MockMvcResultHandlers

(1)結(jié)果處理器,表示要對結(jié)果做點什么事情

(2)比如此處使用 MockMvcResultHandlers.print() 輸出整個響應結(jié)果信息

8)MvcResult

(1)單元測試執(zhí)行結(jié)果,可以針對執(zhí)行結(jié)果進行「自定義驗證邏輯」。

三、測試用例演示

1、添加依賴

org.springframeworkspring-test5.0.7.RELEASEjunitjunit4.12com.jayway.jsonpathjson-path2.2.0

前兩個 jar 依賴我們都已經(jīng)接觸過了,對于返回視圖方法的測試這兩個 jar 依賴已經(jīng)足夠了,第三個 jar 依賴是用于處理返回 Json 數(shù)據(jù)方法的,這里要明白每個 jar 的具體作用。

2、被測試的方法

@RequestMapping(value = "editItem")
public String editItem(Integer id, Model model) {
 Item item = itemService.getItemById(id);
 model.addAttribute("item", item); return "itemEdit";
}

@RequestMapping(value = "getItem")
@ResponseBody
public Item getItem(Integer id) {
 Item item = itemService.getItemById(id); return item;
}

這里我們提供了兩個方法,一個是返回視圖的方法,另一個是返回 Json 數(shù)據(jù)的方法,下面我們會給出測試類,分別對這兩個方法進行測試。

3、測試類:ItemMockTest

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/*.xml")
@WebAppConfiguration
public class ItemMockTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @Before
    public void init() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }
}

這里前兩個注解就不再解釋了,我們在學習 Spring 與 Junit 整合的時候已經(jīng)講解過了,這里說一下第三個注解:@WebAppConfiguration:可以在單元測試的時候,不用啟動 Servlet 容器,就可以獲取一個 Web 應用上下文。

1)返回視圖方法測試

@Test
public void test() throws Exception {
 MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/editItem").param("id", "1"))
   .andExpect(MockMvcResultMatchers.view().name("itemEdit"))
   .andExpect(MockMvcResultMatchers.status().isOk())
   .andDo(MockMvcResultHandlers.print())
   .andReturn();
 Assert.assertNotNull(result.getModelAndView().getModel().get("item"));
}

高手都這么給Spring MVC做單元測試! img

這三句代碼是我們對結(jié)果的期望,最后打印出了結(jié)果,說明執(zhí)行成功,所有期望都達到了,否則會直接報錯。從結(jié)果中我們就可以看到這個請求測試的情況。

2、返回 Json 數(shù)據(jù)方法

@Test
public void test1() throws Exception {
 mockMvc.perform(MockMvcRequestBuilders.get("/getItem")
   .param("id", "1")
   .accept(MediaType.APPLICATION_JSON))
   .andExpect(MockMvcResultMatchers.status().isOk())
   .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
   .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1))
   .andExpect(MockMvcResultMatchers.jsonPath("$.name").value("IPhone X"))
   .andDo(MockMvcResultHandlers.print())
   .andReturn();
}

高手都這么給Spring MVC做單元測試! img

在這個方法中比較特殊的就是設置 MediaType 類型,因為都是使用 Json 格式,所以設置了 MediaType.APPLICATION_JSON,jsonPath 用于比對期望的數(shù)據(jù)是否與返回的結(jié)果一致,這里需要注意的是 "$.id" 這 key 的種形式。

四、小結(jié)

這里只是用到了 MockMvc 很小一部分知識,更加深入學習會使你養(yǎng)成一種良好編寫單元測試的習慣,這是十分難得的一種好習慣,推薦去看官方文檔,然后動手去測試一下,為你編寫的每一個 Controller 方法進行測試,保證他們的可靠性。


免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構(gòu)授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉