1. 程式人生 > 其它 >java基礎之單元測試

java基礎之單元測試

準備工作

springboot使用單元測試需要先引入以下依賴

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

test依賴會引入如下的jar包

service單元測試

springboot中單元測試類寫在src/test/java目錄下,可以進行手動建立測試類,或者通過idea自動建立測試類ctrl+shift+T(shift+command+T)或者選單欄滑鼠點選建立:

上面就是最簡單的單元測試寫法,想要執行的時候,滑鼠放在對應的方法,右鍵選擇run該方法即可。

controller單元測試

對controller進行單元測試時,需要使用到MockMvc了。這樣就可以不必啟動專案就可以測試這些介面了。
MockMvc實現了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,這樣可以使得測試速度快、不依賴網路環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。
示例程式碼如下:

package com.test.danyuanceshi.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 單元測試聯絡示例使用到的controller
 */
@RestController
public class DanYuanCeShiController {

    @GetMapping("/get/not/param")
    public String testDanYanControllerNotParam(){
        return "沒有請求引數的單元測試get方法";
    }

}
package com.test.danyuanceshi.controller;


import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@SpringBootTest
@RunWith(SpringRunner.class)
public class DanYuanCeShiControllerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception{
        //初始化mockMvc物件
        //指定webApplicationContext上下文,將會從這個上下文獲取對應的控制器並得到相應的mockMvc
        System.out.println("----初始化mockMvc-----");
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        System.out.println("----mockMvc執行完畢------");
    }

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

    @Test
    public void testDanYanControllerNotParam() throws Exception {
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/get/not/param")
                .accept(MediaType.TEXT_HTML_VALUE)
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        int status = mvcResult.getResponse().getStatus();
        String content = mvcResult.getResponse().getContentAsString();
        Assert.assertEquals(200, status);
//        Assert.assertEquals("nice", content);
        System.out.println("測試before");
    }


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

SpringBoot引入MockMvc

  1. 什麼是Mock?
    在面向物件的程式設計中,模擬物件(mock object)是以可控的方式模擬真實物件行為的假物件。在程式設計過程中,通常通過模擬一些輸入資料,來驗證程式是否達到預期結果。
  2. 為什麼使用Mock物件
    使用模擬物件,可以模擬複雜的、真實的物件行為。如果在單元測試中無法使用真實物件,可採用模擬物件進行替代。
  3. MockMvc的概念
    MockMvc是由spring-test包提供,實現了對http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,使得測試速度快、不依賴網路環境。同時提供了一套驗證的工具,結果的驗證十分方便。
    介面MockMvcBuilder,提供一個唯一的build方法,用來構造MockMvc。主要有兩個實現StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
  4. MockMvc的基本步驟
    (1)mockMvc.perform執行一個請求
    (2)MockMvcRequestBuilders.get("xxx")構造一個請求
    (3)ResultActions.param新增請求傳值
    (4)ResultActions.accept()設定返回型別
    (5)ResultActions.addExpect新增執行完成後的斷言
    (6)ResultActions.andDo新增一個結果處理器,表示要對結果做的事情,例如使用print()輸出相應資訊
    (7)ResultActions.andReturn 表示執行完成後返回相應的結果

註解解釋

  1. @SpringBootTest:獲取啟動類,載入配置,尋找主配置啟動類(@SpringBootApplication註解的)
  2. @RunWith(SpringRunner.class):讓JUnit執行Spring的測試環境,獲取Spring環境的上下文支援
  3. @AutoConfigureMockMvc:用於自動配置MockMvc,配置後MockMvc類可以直接注入,相當於new MockMvc
  4. @Before:初始化方法,對於每一個測試方法都要執行一次。
    斷言的概念
  5. 斷言(assert),程式設計術語,表示為一些布林表示式,在程式中的某個特定點該表示式值為真。可以在任何時候啟用或者禁用斷言驗證。因此可以在測試時啟用斷言而在部署的時候禁用斷言
  6. 斷言用來判斷一個函式或者物件的一個方法所產生的結果是否符合期望的值

assertThat使用

JUnit 4.4 結合 Hamcrest 提供了一個全新的斷言語法——assertThat。可以只使用 assertThat 一個斷言語句,結合 Hamcrest 提供的匹配符,就可以表達全部的測試思想。
assertThat的優點:

  1. 以前 JUnit 提供了很多的 assertion 語句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,現在有了 JUnit 4.4,一條 assertThat 即可以替代所有的 assertion 語句,這樣可以在所有的單元測試中只使用一個斷言方法,使得編寫測試用例變得簡單,程式碼風格變得統一,測試程式碼也更容易維護。
  2. assertThat 使用了 Hamcrest 的 Matcher 匹配符,使用者可以使用匹配符規定的匹配準則精確的指定一些想設定滿足的條件,具有很強的易讀性,而且使用起來更加靈活。
  3. assertThat 不再像 assertEquals 那樣,使用比較難懂的“謂賓主”語法模式(如:assertEquals(3, x);),相反,assertThat 使用了類似於“主謂賓”的易讀語法模式(如:assertThat(x,is(3));),使得程式碼更加直觀、易讀。

基本語法:
assertThat( [value], [matcher statement] );
value :接下來想要測試的變數值; matcher statement :使用 Hamcrest 匹配符來表達的對前面變數所期望的值的宣告,如果 value 值與 matcher statement 所表達的期望值相符,則測試成功,否則測試失敗。