SpringBoot 單元測試入門實踐

icecho發表於2020-10-22

前言

軟體測試的重要性毋庸置疑。大部分公司主業務的支撐軟體,在開發時都會要求編寫測試。在日常開發中,也有不少要求我們寫測試的場景,例如你將要開源擴充套件包,擁有完整測試永遠是加分項 ?。

專案環境

  • JDK 14
  • Gradle 6.3
  • macOS 10.15
  • SpringBoot 2.3.4

JUnit 介紹

大部分新手在測試程式的時候,喜歡用 System.out.println() 方法,直接把結果列印出來,看看結果是否符合預期。這種方法在測試程式碼量很小、邏輯簡單的程式時很方便。在實際生產專案中,我們可以嘗試一下 JUnit 工具。

JUnit 是 Java 語言的測試框架。它可以根據測試資料來驗證程式正確性,並且測試程式碼與工程程式碼分離。只要在方法上加上 @Test 註解,JUint 就能識別到這個方法。

引入依賴

這裡我們使用的構建工具是 gradle,所以開啟 build.gradle 檔案引入依賴。該依賴包含了 JUnit 等,所以無需再單獨引入 JUnit。

implementation 'org.springframework.boot:spring-boot-starter-test:2.3.4.RELEASE'

測試 Service 層

編寫一份 DemoService 介面,該介面只有一個 sayHelloTo 方法來用於我們簡單的單元測試。

public interface DemoService {
    /**
     * Hello World!
     * @param name 名稱
     * @return String
     */
    String sayHelloTo(String name);
}

建立 DemoServiceImpl 類,實現 DemoService 介面。這裡可使用 ⌥ + ⏎ 快速建立介面實現類。

@Service
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHelloTo(String name) {
        return "say hello to " + name;
    }
}

SpringBoot 的單元測試寫在 src/tests 目錄下,如果你使用的是 IDEA IDE,可按下 ⇧ + ⌘ + T 來快速建立測試檔案。

@SpringBootTest
class DemoServiceTest {
    @Autowired
    private DemoService demoService;
    @Test
    void sayHelloTo() {
        String result = demoService.sayHelloTo("developer");
        Assertions.assertEquals("say hello to developer", result);
    }
}

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

測試 Controller 層

編寫一份 DemoController,建立一個 sayHelloTo 方法,並且注入 DemoService 介面。

@RestController
public class DemoController {
    @Autowired
    private DemoService demoService;

    @GetMapping("demo")
    public String sayHelloTo(String name) {
        return demoService.sayHelloTo(name);
    }
}

沿用 ⇧ + ⌘ + T 快捷鍵建立控制器測試類,這裡用到了 MockMvc,MockMvc 是由 spring-test 包提供,實現了對 HTTP 請求的模擬,能夠直接使用網路的形式,轉換到 Controller 的呼叫,使得測試速度快、不依賴網路環境。同時提供了一套驗證的工具,結果的驗證十分方便。

@AutoConfigureMockMvc
@SpringBootTest
class DemoControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void sayHelloTo() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/demo?name=developer"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("say hello to developer"))
                .andDo(MockMvcResultHandlers.print());
    }
}

這裡簡單的使用 MockMvc 測試 API 介面返回的 HTTP STATUS CODE 以及返回的內容,並將整個響應結果輸出出來。

總結

這裡非常簡單的過了一遍 SpringBoot 單元測試流程,也只是作為一個入門實踐記錄在這兒。對 JUnit 和 MockMvc 有了一個最基礎的認識,有興趣的夥伴可以自己查詢一些資料進行深入學習。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Hello。

相關文章