最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Spring Boot實(shí)戰(zhàn)練習(xí)之單元測(cè)試篇

 更新時(shí)間:2021年10月14日 11:02:53   作者:程序猿-小菜  
單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。對(duì)于單元測(cè)試中單元的含義,一般來(lái)說(shuō),要根據(jù)實(shí)際情況去判定其具體含義,如C語(yǔ)言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類(lèi),圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等

   在這里插入圖片描述

一、關(guān)于JUnit的一些東西

  在我們開(kāi)發(fā)Web應(yīng)用時(shí),經(jīng)常會(huì)直接去觀察結(jié)果進(jìn)行測(cè)試。雖然也是一種方式,但是并不嚴(yán)謹(jǐn)。作為開(kāi)發(fā)者編寫(xiě)測(cè)試代碼來(lái)測(cè)試自己所寫(xiě)的業(yè)務(wù)邏輯是,以提高代碼的質(zhì)量、降低錯(cuò)誤方法的概率以及進(jìn)行性能測(cè)試等。經(jīng)常作為開(kāi)發(fā)這寫(xiě)的最多就是單元測(cè)試。引入spring-boot-starter-testSpringBoot的測(cè)試依賴(lài)。該依賴(lài)會(huì)引入JUnit的測(cè)試包,也是我們用的做多的單元測(cè)試包。而Spring Boot在此基礎(chǔ)上做了很多增強(qiáng),支持很多方面的測(cè)試,例如JPA,MongoDB,Spring MVC(REST)和Redis等。
接下來(lái)主要是測(cè)試業(yè)務(wù)邏輯層的代碼,REST和Mock測(cè)試。

1.1 JUnit介紹

  JUnit是一個(gè)Java語(yǔ)言的單元測(cè)試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源于Kent Beck的sUnit的xUnit家族中最為成功的一個(gè)。 JUnit有它自己的JUnit擴(kuò)展生態(tài)圈。多數(shù)Java的開(kāi)發(fā)環(huán)境都已經(jīng)集成了JUnit作為單元測(cè)試的工具。

JUnit相關(guān)概念 含義
測(cè)試 一個(gè)以@Test注釋的方法定義一個(gè)測(cè)試,運(yùn)行這個(gè)方法,JUnit會(huì)創(chuàng)建一個(gè)包含類(lèi)的實(shí)例,然后再調(diào)用這個(gè)被注釋的方法。
測(cè)試類(lèi) 包含多個(gè)@Test方法的一個(gè)類(lèi)
Assert 定義想測(cè)試的條件,當(dāng)條件成立時(shí),assert 方法保持沉默,條件不成立時(shí),則拋出異常
Suite Suite允許將測(cè)試類(lèi)歸類(lèi)成一組
Runner Runner類(lèi)用于運(yùn)行測(cè)試,JUnit4是向后兼容的,可以運(yùn)行JUnit3的測(cè)試實(shí)例

  這里使用的是JUnit4.x版本,JUnit中有兩個(gè)重要的類(lèi)Assume+Assert,以及重要的注解:BeforeClass、AfterClass、After、Before、Test和Ignore。BeforeClass和AfterClass在每個(gè)類(lèi)的開(kāi)始和結(jié)束的時(shí)候運(yùn)行,需要static修飾方法。而B(niǎo)efore和After則是在每個(gè)測(cè)試方法的開(kāi)始和結(jié)束的時(shí)候運(yùn)行。
代碼片段:TestDeployApplication.class是自己編寫(xiě)的Spring Boot啟動(dòng)類(lèi)。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestDeployApplication.class})
public class UnitTest1 {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("=================BeforeClass================");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("=================AfterClass================");
    }

    @Before
    public void beforeTest() {
        System.out.println("before test");
    }

    @After
    public void afterTest() {
        System.out.println("after test");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }
}

1.2 JUnit的Assert類(lèi)

Assert類(lèi)中常用的方法:

  • assertEquals(“提示信息”,A,B):當(dāng)判斷A是否等于B,不等于就拋出錯(cuò)誤。比較對(duì)象是調(diào)用的是equals()方法。
  • assertSame(“提示信息”,A,B):判斷對(duì)象是否相同。
  • assertTrue(“提示信息”,A):判斷條件A是否為真。
  • assertFalse(“提示信息”,A):判斷條件是否為假。
  • assertNotNull(“提示信息”,A):判斷對(duì)象是否不為空。
  • assertNull(“提示信息”,A):判斷對(duì)象是否不為空。
  • assertArrayEqual(“提示信息”,A,B):判斷數(shù)組A和數(shù)組B是否相等。

1.3 JUnit的Suite

  JUnit的Suite設(shè)計(jì)就是一次性運(yùn)行一個(gè)或多個(gè)測(cè)試用例,Suite可以看作是一個(gè)容器,用來(lái)把測(cè)試類(lèi)歸類(lèi)在一起,并把他們作為一個(gè)集合來(lái)運(yùn)行,運(yùn)行器啟動(dòng)Suite。

@RunWith(Suite.class)
@SuiteClasses({UnitTest1.class,UnitTest2.class})
public class MainTest{
    
}

二、Spring Boot單元測(cè)試

添加需要的依賴(lài)

<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2.1 Spring Boot測(cè)試依賴(lài)提供的測(cè)試范圍

引入了spring-boot-starter-test繼承了很多的測(cè)試庫(kù):

  • JUnit,標(biāo)準(zhǔn)的單元測(cè)試Java程序。
  • Spring Test和Spring Boot Test,對(duì)Spring Boot應(yīng)用的單元測(cè)試。
  • Mockito,Java Mock測(cè)試框架,用于模擬任何Spring管理的Bean。例如在- - 單元測(cè)試中,模擬一個(gè)第三方系統(tǒng)接口返回的數(shù)據(jù),而不用真正地去請(qǐng)求第三方接口。
  • AssertJ,一個(gè)assertion庫(kù),同時(shí)提供了更加多的期望值與測(cè)試返回值的比較方式。
  • Hamcrest,庫(kù)的匹配對(duì)象。
  • JSONassert,對(duì)JSON對(duì)象或者JSON字符串?dāng)嘌缘膸?kù)。
  • JSONPath,提供向XPath那樣的符號(hào)來(lái)獲取JSON字段。

2.2 Spring Boot單元測(cè)試的腳手架

在使用spring.io創(chuàng)建的Spring Boot工程中,就默認(rèn)常見(jiàn)了一個(gè)單元測(cè)試的類(lèi)。

@RunWith(SpringRunner.class)
@SpringBootTest
public class UnitTest1 {
	@Test
    public void contextLoads(){
        
    }
}

  @RunWith是JUnit中的注解,用來(lái)通知JUnit單元測(cè)試框架不要使用內(nèi)置的方式進(jìn)行單元測(cè)試,向上面的寫(xiě)法,就是指定使用SpringRunner類(lèi)來(lái)提供單元測(cè)試。
  @SpringBootTest注解則是用于Spring Boot應(yīng)用的測(cè)試,默認(rèn)會(huì)分局報(bào)名逐級(jí)往上查找Spring Boot主程序,也就是@SpringBootApplocation注解,并在單元測(cè)試啟動(dòng)的時(shí)候啟動(dòng)該類(lèi)來(lái)創(chuàng)建Spring上下文。所以我們?cè)趯?duì)Spring Boot應(yīng)用進(jìn)行單元測(cè)試的時(shí)候,在日志輸出都可以看到Spring Boot應(yīng)用的啟動(dòng)日志。

2.3 對(duì)Service層代碼測(cè)試

import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.*;

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class ServiceUnitTest {

    @MockBean
    private ThirdSystemService thirdSystemService;

    @Autowired
    private ISysUserService userService;

    @Test
    public void test1() {
        Long expectResult = 100L;
        given(thirdSystemService.develop()).willReturn(expectResult);
        SysUser sysUser = userService.findById(expectResult);
        System.out.println(sysUser.toString());
    }
}

  @MockBean可以獲取在Spring下上文管理的Bean,但是thirdSystemService這個(gè)Bean并不是真的實(shí)列,而是通過(guò)Mockito工具創(chuàng)建的測(cè)試實(shí)例。通過(guò)@MockBean注解模擬出來(lái)的Bean,調(diào)用方法是不會(huì)真正的調(diào)用真正的方法,適用于在依賴(lài)了第三方的系統(tǒng),然而第三方的系統(tǒng)的對(duì)接并沒(méi)有實(shí)現(xiàn)完成,自己可以單獨(dú)測(cè)試自己的業(yè)務(wù)代碼。willReturn(expectResult)說(shuō)明結(jié)果永遠(yuǎn)返回100L。

2.4 測(cè)試MVC代碼

  Spring Boot中還能單獨(dú)測(cè)試Controller的代碼,例如測(cè)試Controller中方法的參數(shù)綁定和校驗(yàn)之類(lèi)的邏輯??梢酝ㄟ^(guò)@WebMvcTest注解來(lái)完成單元測(cè)試。

@RunWith(SpringRunner.class)
@WebMvcTest(SysUserController.class)
public class ServiceUnitTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test2() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/hello/{id}", 1L);
        mockMvc.perform(requestBuilder)
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }
}

像Get方法傳遞參數(shù)

MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
       .get("/hello/{id}", 1L)   // path變量
       .param("name", "hello");  // @RequestParam 獲取變量。post請(qǐng)求也適用

文件上傳

@RunWith(SpringRunner.class)
@WebMvcTest(SysUserController.class)
public class ServiceUnitTest {

   @Autowired
   private MockMvc mockMvc;

   @Test
   public void test3() throws Exception {
       // 獲取文件
       FileInputStream fileInputStream = new FileInputStream("文件路徑");
       // 構(gòu)建文件上傳對(duì)象
       MockMultipartFile mockMultipartFile = new MockMultipartFile("file", fileInputStream);
       // 構(gòu)建mock文件上傳請(qǐng)求
       MockMultipartHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.multipart("/upload").file(mockMultipartFile);
       // 發(fā)送請(qǐng)求
       mockMvc.perform(requestBuilder)
               .andExpect(MockMvcResultMatchers.status().isOk())
               .andDo(MockMvcResultHandlers.print());
   }
}
模擬Cookie和Session
@RunWith(SpringRunner.class)
@WebMvcTest(SysUserController.class)
public class ServiceUnitTest {

   @Autowired
   private MockMvc mockMvc;

   @Test
   public void test4() throws Exception {
       MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
               .get("index.html")
               .sessionAttr("name", "hello")
               .cookie(new Cookie("token", "123345"));
       mockMvc.perform(requestBuilder)
               .andExpect(MockMvcResultMatchers.status().isOk())
               .andDo(MockMvcResultHandlers.print());

   }
}

設(shè)置請(qǐng)求頭

@RunWith(SpringRunner.class)
@WebMvcTest(SysUserController.class)
public class ServiceUnitTest {

   @Autowired
   private MockMvc mockMvc;

   @Test
   public void test5() throws Exception {
       MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
               .get("index.html")
               .content(MediaType.APPLICATION_JSON_VALUE) // 期望返回類(lèi)型
               .contentType(MediaType.APPLICATION_JSON_VALUE) // 提交的內(nèi)容類(lèi)型
               .header("token", 1235); // 設(shè)置請(qǐng)求頭
       mockMvc.perform(requestBuilder)
               .andExpect(MockMvcResultMatchers.status().isOk())
               .andDo(MockMvcResultHandlers.print());

   }
}

2.5 比較返回結(jié)果

  MockMvc類(lèi)的perform方法會(huì)返回一個(gè)ResultAction類(lèi),可以對(duì)結(jié)果進(jìn)行一些操作(andExpect、andDo和andReturn)。

@RunWith(SpringRunner.class)
@WebMvcTest(SysUserController.class)
public class ServiceUnitTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test2() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
                .get("/hello/{id}", 1L)
                .param("name", "hello");

        mockMvc.perform(requestBuilder)
                .andExpect(MockMvcResultMatchers.jsonPath("$.id", "id").value(2L));
                .andDo(MockMvcResultHandlers.print());
    }
}

  例如上面獲取返回的JSON結(jié)果中的id字段的值,value是期望值,如果期望值與實(shí)際值不一樣測(cè)試就會(huì)報(bào)錯(cuò)。
也可以斷言測(cè)試返回結(jié)果的View(視圖)和Model(數(shù)據(jù)模型)是否是期望值

@RunWith(SpringRunner.class)
@WebMvcTest(SysUserController.class)
public class ServiceUnitTest {

    @Autowired
    private MockMvc mockMvc;

    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
                .get("/hello/{id}", 1L)
                .param("name", "hello");

        mockMvc.perform(requestBuilder)
            	// 斷言返回的試圖
                .andExpect(MockMvcResultMatchers.view().name("index.html"))
            	// 斷言返回的數(shù)據(jù)模型中的數(shù)據(jù)
                .andExpect(MockMvcResultMatchers.model().attribute("id",1L))
                .andDo(MockMvcResultHandlers.print());
}

更多的結(jié)果斷言可以在MockMvcResultMatchers類(lèi)中找到,該類(lèi)是請(qǐng)求結(jié)果的匹配的一個(gè)工具類(lèi)。

  如果對(duì)軟件測(cè)試、接口測(cè)試、自動(dòng)化測(cè)試、持續(xù)集成、面試經(jīng)驗(yàn)。感興趣  可以進(jìn)到806549072,群內(nèi)會(huì)有不定期的分享測(cè)試資料。還會(huì)有技術(shù)大牛,業(yè)內(nèi)同行一起交流技術(shù)

到此這篇關(guān)于Java Spring Boot實(shí)戰(zhàn)練習(xí)之單元測(cè)試篇的文章就介紹到這了,更多相關(guān)Java Spring Boot 單元測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用SpringMVC接收文件流上傳和表單參數(shù)

    使用SpringMVC接收文件流上傳和表單參數(shù)

    這篇文章主要介紹了使用SpringMVC接收文件流上傳和表單參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java運(yùn)行Python腳本的幾種方式小結(jié)

    Java運(yùn)行Python腳本的幾種方式小結(jié)

    在跨語(yǔ)言編程中,有時(shí)候我們需要在 Java 應(yīng)用程序中執(zhí)行 Python 腳本,這可能是為了利用 Python 豐富的庫(kù)生態(tài)系統(tǒng),或者是為了在已有 Java 系統(tǒng)中集成一些 Python 特有的功能,本文給大家介紹了實(shí)現(xiàn)這幾種目標(biāo)的方法,需要的朋友可以參考下
    2024-12-12
  • Java加載本地庫(kù)的方法之System.load與System.loadLibrary

    Java加載本地庫(kù)的方法之System.load與System.loadLibrary

    最近在做的工作要用到本地方法,所以下面這篇文章主要介紹了Java加載本地庫(kù)的方法之System.load與System.loadLibrary的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • centos7安裝jdk-8u333詳細(xì)圖文教程

    centos7安裝jdk-8u333詳細(xì)圖文教程

    很多集成環(huán)境并不包含jdk環(huán)境,即使有相應(yīng)的組件,在使用時(shí)也無(wú)法很好的使用,調(diào)試過(guò)程中也會(huì)遇到各種各樣的問(wèn)題,所以很多情況下還是建議在服務(wù)器內(nèi)手動(dòng)部署,下面這篇文章主要給大家介紹了關(guān)于centos7安裝jdk-8u333的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Java文件IO操作教程之DirectIO的意義

    Java文件IO操作教程之DirectIO的意義

    這篇文章主要給大家介紹了關(guān)于Java文件IO操作教程之DirectIO的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件【測(cè)試無(wú)誤】

    SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件【測(cè)試無(wú)誤】

    這篇文章主要介紹了SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件的相關(guān)知識(shí),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • java實(shí)現(xiàn)九宮格游戲

    java實(shí)現(xiàn)九宮格游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)九宮格游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • SpringBoot解決BigDecimal傳到前端后精度丟失問(wèn)題

    SpringBoot解決BigDecimal傳到前端后精度丟失問(wèn)題

    這篇文章將通過(guò)示例詳細(xì)為大家介紹SpringBoot如何解決BigDecimal傳到前端后精度丟失問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-06-06
  • Struts1教程之ActionMapping_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Struts1教程之ActionMapping_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Struts1教程之ActionMapping,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • SpringBoot基于Redis實(shí)現(xiàn)token的在線續(xù)期的實(shí)踐

    SpringBoot基于Redis實(shí)現(xiàn)token的在線續(xù)期的實(shí)踐

    本文主要介紹了使用Redis實(shí)現(xiàn)JWT令牌在線續(xù)期的方案,通過(guò)在線續(xù)期token,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12

最新評(píng)論

交城县| 石屏县| 霸州市| 咸丰县| 义乌市| 龙游县| 徐汇区| 许昌县| 永平县| 南乐县| 天镇县| 安岳县| 奎屯市| 金山区| 汪清县| 珲春市| 凌云县| 永川市| 丰台区| 股票| 松桃| 堆龙德庆县| 明水县| 南汇区| 泽库县| 定结县| 杭锦后旗| 喀喇沁旗| 丰原市| 互助| 微山县| 迁安市| 庆安县| 宕昌县| 临颍县| 北海市| 关岭| 门源| 宜兰市| 观塘区| 泽普县|