真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot項(xiàng)目中Mockito如何使用

SpringBoot項(xiàng)目中Mockito如何使用,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

井陘ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!

Spring Boot可以和大部分流行的測(cè)試框架協(xié)同工作:通過(guò)Spring JUnit創(chuàng)建單元測(cè)試;生成測(cè)試數(shù)據(jù)初始化數(shù)據(jù)庫(kù)用于測(cè)試;Spring Boot可以跟BDD(Behavier Driven Development)工具、Cucumber和Spock協(xié)同工作,對(duì)應(yīng)用程序進(jìn)行測(cè)試。

進(jìn)行軟件開(kāi)發(fā)的時(shí)候,我們會(huì)寫(xiě)很多代碼,不過(guò),再過(guò)六個(gè)月(甚至一年以上)你知道自己的代碼怎么運(yùn)作么?通過(guò)測(cè)試(單元測(cè)試、集成測(cè)試、接口測(cè)試)可以保證系統(tǒng)的可維護(hù)性,當(dāng)我們修改了某些代碼時(shí),通過(guò)回歸測(cè)試可以檢查是否引入了新的bug。總得來(lái)說(shuō),測(cè)試讓系統(tǒng)不再是一個(gè)黑盒子,讓開(kāi)發(fā)人員確認(rèn)系統(tǒng)可用。

在web應(yīng)用程序中,對(duì)Controller層的測(cè)試一般有兩種方法:(1)發(fā)送http請(qǐng)求;(2)模擬http請(qǐng)求對(duì)象。第一種方法需要配置回歸環(huán)境,通過(guò)修改代碼統(tǒng)計(jì)的策略來(lái)計(jì)算覆蓋率;第二種方法是比較正規(guī)的思路,但是在我目前經(jīng)歷過(guò)的項(xiàng)目中用得不多,今天總結(jié)下如何用Mock對(duì)象測(cè)試Controller層的代碼。

在之前的幾篇文章中,我們都使用bookpub這個(gè)應(yīng)用程序作為例子,今天也不例外,準(zhǔn)備測(cè)試它提供的RESTful接口是否能返回正確的響應(yīng)數(shù)據(jù)。這種測(cè)試不同于單元測(cè)試,需要為之初始化完整的應(yīng)用程序上下文、所有的spring bean都織入以及數(shù)據(jù)庫(kù)中需要有測(cè)試數(shù)據(jù),一般來(lái)說(shuō)這種測(cè)試稱(chēng)之為集成測(cè)試或者接口測(cè)試。

實(shí)戰(zhàn)

通過(guò)spirng.io新建的Spring Boot項(xiàng)目提供了一個(gè)空的測(cè)試文件——BookPubApplicationTest.java,內(nèi)容是:

@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = BookPubApplication.class)public class BookPubApplicationTests {  @Test  public void contextLoads() {  }}

在pom文件中增加spring-boot-starter-test依賴(lài),添加jsonPath依賴(lài)

 org.springframework.boot  spring-boot-starter-test  test  com.jayway.jsonpath  json-path

在BookPubApplicationTest中添加測(cè)試用例

package com.test.bookpub;import com.test.bookpub.domain.Book;import com.test.bookpub.repository.BookRepository;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.test.SpringApplicationConfiguration;import org.springframework.boot.test.TestRestTemplate;import org.springframework.boot.test.WebIntegrationTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.client.RestTemplate;import org.springframework.web.context.WebApplicationContext;import static org.junit.Assert.assertEquals;import static org.junit.Assert.assertNotNull;import static org.hamcrest.Matchers.containsString;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = BookPubApplication.class)@WebIntegrationTest("server.port:0")public class BookPubApplicationTests {  @Autowired  private WebApplicationContext context;  @Autowired  private BookRepository bookRepository;  @Value("${local.server.port}")  private int port;  private MockMvc mockMvc;  private RestTemplate restTemplate = new TestRestTemplate();  @Before  public void setupMockMvc() {    mockMvc = MockMvcBuilders.webAppContextSetup(context).build();  }  @Test  public void contextLoads() {    assertEquals(1, bookRepository.count());  }  @Test  public void webappBookIsbnApi() {    Book book = restTemplate.getForObject("http://localhost:" + port +"/books/9876-5432-1111", Book.class);    assertNotNull(book);    assertEquals("中文測(cè)試", book.getPublisher().getName());  }  @Test  public void webappPublisherApi() throws Exception {    //MockHttpServletRequestBuilder.accept方法是設(shè)置客戶(hù)端可識(shí)別的內(nèi)容類(lèi)型    //MockHttpServletRequestBuilder.contentType,設(shè)置請(qǐng)求頭中的Content-Type字段,表示請(qǐng)求體的內(nèi)容類(lèi)型    mockMvc.perform(get("/publishers/1")        .accept(MediaType.APPLICATION_JSON_UTF8))        .andExpect(status().isOk())         .andExpect(content().string(containsString("中文測(cè)試")))        .andExpect(jsonPath("$.name").value("中文測(cè)試"));  }}

spring boot項(xiàng)目的代碼覆蓋率

使用cobertura,參考項(xiàng)目的github地址:spring boot template

# To create test coverage reports (in target/site/cobertura)mvn clean cobertura:cobertura test

分析

首先分析在BookPubApplicationTests類(lèi)中用到的注解:

@RunWith(SpringJUnit4ClassRunner.class),這是JUnit的注解,通過(guò)這個(gè)注解讓SpringJUnit4ClassRunner這個(gè)類(lèi)提供Spring測(cè)試上下文。  @SpringApplicationConfiguration(classes = BookPubApplication.class),這是Spring Boot注解,為了進(jìn)行集成測(cè)試,需要通過(guò)這個(gè)注解加載和配置Spring應(yīng)用上下文。這是一個(gè)元注解(meta-annoation),它包含了@ContextConfiguration( loader = SpringApplicationContextLoader.class)這個(gè)注解,測(cè)試框架通過(guò)這個(gè)注解使用Spring Boot框架的SpringApplicationContextLoader加載器創(chuàng)建應(yīng)用上下文。  @WebIntegrationTest(“server.port:0”),這個(gè)注解表示當(dāng)前的測(cè)試是集成測(cè)試(integration test),因此需要初始化完整的上下文并啟動(dòng)應(yīng)用程序。這個(gè)注解一般和@SpringApplicationConfiguration一起出現(xiàn)。server.port:0指的是讓Spring Boot在隨機(jī)端口上啟動(dòng)Tomcat服務(wù),隨后在測(cè)試中程序通過(guò)@Value(“${local.server.port}”)獲得這個(gè)端口號(hào),并賦值給port變量。當(dāng)在Jenkins或其他持續(xù)集成服務(wù)器上運(yùn)行測(cè)試程序時(shí),這種隨機(jī)獲取端口的能力可以提供測(cè)試程序的并行性。

了解完測(cè)試類(lèi)的注解,再看看測(cè)試類(lèi)的內(nèi)部。由于這是Spring Boot的測(cè)試,因此我們可通過(guò)@Autowired注解織入任何由Spring管理的對(duì)象,或者是通過(guò)@Value設(shè)置指定的環(huán)境變量的值。在現(xiàn)在這個(gè)測(cè)試類(lèi)中,我們定義了WebApplicationContext和BookRepository對(duì)象。

每個(gè)測(cè)試用例用@Test注解修飾。在第一個(gè)測(cè)試用例——contextLoads()方法中,我僅僅需要確認(rèn)BookRepository連接已經(jīng)建立,并且數(shù)據(jù)庫(kù)中已經(jīng)包含了對(duì)應(yīng)的測(cè)試數(shù)據(jù)。

第二個(gè)測(cè)試用例用來(lái)測(cè)試我們提供的RESTful URL——通過(guò)ISBN查詢(xún)一本書(shū),即“/books/{isbn}”。在這個(gè)測(cè)試用例中我們使用TestRestTemplate對(duì)象發(fā)起RESTful請(qǐng)求。

第三個(gè)測(cè)試用例中展示了如何通過(guò)MockMvc對(duì)象實(shí)現(xiàn)跟第二個(gè)測(cè)試類(lèi)似的功能。Spring測(cè)試框架提供MockMvc對(duì)象,可以在不需要客戶(hù)端-服務(wù)端請(qǐng)求的情況下進(jìn)行MVC測(cè)試,完全在服務(wù)端這邊就可以執(zhí)行Controller的請(qǐng)求,跟啟動(dòng)了測(cè)試服務(wù)器一樣。

測(cè)試開(kāi)始之前需要建立測(cè)試環(huán)境,setup方法被@Before修飾。通過(guò)MockMvcBuilders工具,使用WebApplicationContext對(duì)象作為參數(shù),創(chuàng)建一個(gè)MockMvc對(duì)象。

MockMvc對(duì)象提供一組工具函數(shù)用來(lái)執(zhí)行assert判斷,都是針對(duì)web請(qǐng)求的判斷。這組工具的使用方式是函數(shù)的鏈?zhǔn)秸{(diào)用,允許程序員將多個(gè)測(cè)試用例鏈接在一起,并進(jìn)行多個(gè)判斷。在這個(gè)例子中我們用到下面的一些工具函數(shù):

perform(get(…))建立web請(qǐng)求。在我們的第三個(gè)用例中,通過(guò)MockMvcRequestBuilder執(zhí)行GET請(qǐng)求。  andExpect(…)可以在perform(…)函數(shù)調(diào)用后多次調(diào)用,表示對(duì)多個(gè)條件的判斷,這個(gè)函數(shù)的參數(shù)類(lèi)型是ResultMatcher接口,在MockMvcResultMatchers這這個(gè)類(lèi)中提供了很多返回ResultMatcher接口的工具函數(shù)。這個(gè)函數(shù)使得可以檢測(cè)同一個(gè)web請(qǐng)求的多個(gè)方面,包括HTTP響應(yīng)狀態(tài)碼(response status),響應(yīng)的內(nèi)容類(lèi)型(content type),會(huì)話(huà)中存放的值,檢驗(yàn)重定向、model或者h(yuǎn)eader的內(nèi)容等等。這里需要通過(guò)第三方庫(kù)json-path檢測(cè)JSON格式的響應(yīng)數(shù)據(jù):檢查json數(shù)據(jù)包含正確的元素類(lèi)型和對(duì)應(yīng)的值,例如jsonPath(“$.name”).value(“中文測(cè)試”)用于檢查在根目錄下有一個(gè)名為name的節(jié)點(diǎn),并且該節(jié)點(diǎn)對(duì)應(yīng)的值是“中文測(cè)試”。

一個(gè)字符亂碼問(wèn)題

問(wèn)題描述:通過(guò)spring-boot-starter-data-rest建立的repository,取出的漢字是亂碼。  分析:使用postman和httpie驗(yàn)證都沒(méi)問(wèn)題,說(shuō)明是Mockmvc的測(cè)試用例寫(xiě)得不對(duì),應(yīng)該主動(dòng)設(shè)置客戶(hù)端如何解析HTTP響應(yīng),用get.accept方法設(shè)置客戶(hù)端可識(shí)別的內(nèi)容類(lèi)型,修改后的測(cè)試用例如下:

@Testpublic void webappPublisherApi() throws Exception {  //MockHttpServletRequestBuilder.accept方法是設(shè)置客戶(hù)端可識(shí)別的內(nèi)容類(lèi)型  //MockHttpServletRequestBuilder.contentType,設(shè)置請(qǐng)求頭中的Content-Type字段,表示請(qǐng)求體的內(nèi)容類(lèi)型  mockMvc.perform(get("/publishers/1")      .accept(MediaType.APPLICATION_JSON_UTF8))      .andExpect(status().isOk())      .andExpect(content().string(containsString("中文測(cè)試")))      .andExpect(jsonPath("$.name").value("中文測(cè)試"));}

關(guān)于SpringBoot項(xiàng)目中Mockito如何使用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)站標(biāo)題:SpringBoot項(xiàng)目中Mockito如何使用
地址分享:http://weahome.cn/article/pgpcjp.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部