🔥
Caster 開發日誌
  • Java
    • JVM Performance Tool
      • Java Debug Wire Protocol (JDWP) 的詳細介紹
      • JConsole 詳細介紹
    • Spring Boot
      • Spring Security
      • Spring Boot Admin
      • Spring Event
      • Spring AOP
      • Spring Boot JUnit 5
      • Apache Dubbo
    • Reflect 應用
    • ELK + F 建構
    • Socket.IO
    • OCR - 光學字元辨識
    • 讀取JAR resource文件
    • LocalTime & MySQL時間精度
    • Gradle multi module
    • MyBatis-Plus
    • Java Date operation
    • Java IP to Long
    • Apache Commons lang3 應用
      • Function 應用
    • Cloud Platform
      • Amazon S3
        • SDK V1
          • Bucket
        • SDK V2
          • Bucket
      • Google Cloud Platform
      • Azure Cloud
        • Storage
      • OVHcloud
        • Config
    • SSL/TLS工具
    • Util 工具
      • Jackson Json工具
      • Charles應用
      • JMeter – Performing Distributed Load Testing with Docker
    • Redis
      • Stream
      • Redisson 分布式鎖機制
      • Create Redis Cluster Using Docker
      • List Operations
    • Java 8
      • method & constructor Reference
      • CompletableFuture
      • FunctionInterface
      • Stream 應用
      • 繁簡轉換 - 簡易調整
    • MySQL
      • 建立測試用 流水號Table
      • SQL 效能調校 - Explain
      • SQL 效能調校 - Partition
      • 排程 - Event
    • Apache ShardingSphere
  • Kubernetes
    • 初入江湖(K8S)
    • 零中斷服務滾動更新
    • Kubernetes DNS
    • Ingress & Ingress Controller 教學
    • Ingress TLS Easy setup
  • 指令集
  • Telegram
  • SourceTree
    • 踩坑紀錄(ㄧ) - Git Flow
    • 踩坑紀錄(二) - 修改檔名
  • 專案統計
    • Robot
    • Recharge
  • GitHub
    • Actions
  • GitLab
    • 介紹 GitLab
    • 使用 Docker 自架 GitLab
    • 簡介 GitLab CI/CD
      • GitLab Runner 詳細介紹與設定方式
Powered by GitBook
On this page
  1. Java
  2. Spring Boot

Spring Boot JUnit 5

JUnit5 單元測試

PreviousSpring AOPNextApache Dubbo

Last updated 1 year ago

主要為實作JUnit5 實現單元測試,之前用比較多的都是JUnit4,這次會要使用JUnit5主要是因為Spring Boot 2.2.0 以上的版本 JUnit 都改為JUnit5 的版本,藉由此次專案來徹底玩一下單元測試。

以往在測試API如果有使用Swagger 就可以直接在上面測試,但是如果要做到完整的CI/CD,撰寫單元測試的事情是不可或缺的,但因為很久沒有這樣徹底玩過,確實有很多地方是值得一玩,這邊就作為測試的紀錄~ 參考一: 參考二:

// JUnitController.java

import com.longxiang.backstage.controller.model.request.InsertMerchantReq;
import com.longxiang.backstage.controller.model.request.QueryMerchantReq;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * Author: Caster
 * Date: 2022/9/14
 * Comment:
 */
@RestController
@Api(tags = "JUnit5測試")
@RequestMapping("/junit")
@RequiredArgsConstructor
@Slf4j
public class JUnitController {

    @GetMapping("/list")
    public ResponseEntity list(@ModelAttribute QueryMerchantReq req){
        log.debug("====> list");
        return ResponseEntity.ok("list");
    }
    @GetMapping("/{id}")
    public ResponseEntity info(@PathVariable Integer id){
        log.debug("====> info");
        return ResponseEntity.ok("info");
    }

    @PostMapping("")
    public ResponseEntity insert(@RequestBody InsertMerchantReq req){
        log.debug("====> insert");
        return ResponseEntity.ok("insert");
    }

    @PutMapping("/{id}")
    public ResponseEntity update(@RequestBody InsertMerchantReq req){
        log.debug("====> update");
        return ResponseEntity.ok("update");
    }

    @DeleteMapping("/{id}")
    public ResponseEntity delete(@PathVariable Integer id){
        log.debug("====> delete");
        return ResponseEntity.ok("delete");
    }
}

import com.longxiang.backstage.controller.model.request.InsertMerchantReq;
import com.longxiang.utils.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

/**
 * Author: Caster
 * Date: 2022/9/14
 * Comment:
 */
@Slf4j
@ExtendWith(SpringExtension.class)
@SpringBootTest
@AutoConfigureMockMvc
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnitControllerTest {

    @Autowired
    private MockMvc mockMvc;
    public HttpHeaders httpHeaders = new HttpHeaders();

    @BeforeAll
    static void beforeAll() throws Exception {
        log.info("------ @BeforeAll ------");
    }

    @BeforeEach
    void beforeEach() throws Exception {
        log.info("------ @BeforeEach ------");
    }

    @AfterAll
    static void afterAll() throws Exception {
        log.info("------ @AfterAll ------");
    }

    @AfterEach
    void afterEach() throws Exception {
        log.info("------ @AfterEach ------");
    }

    @Test
    @Order(0)
    public void listTest() throws Exception {
        MultiValueMap<String, String> param = new LinkedMultiValueMap<>();
        param.add("name", "1");
        param.add("status", "1");
        var result =
                mockMvc.perform(
                                MockMvcRequestBuilders.get("/junit/list")
                                        .headers(httpHeaders)
                                        .params(param))
                        .andExpect(status().isOk())
                        .andDo(print())
                        .andReturn();
        System.out.println(result);
    }

    @Test
    @Order(1)
    public void infoTest() throws Exception {
        Integer id = 1;
        var result =
                mockMvc.perform(
                                MockMvcRequestBuilders.get("/junit/{id}", id)
                                        .headers(httpHeaders))
                        .andExpect(status().isOk())
                        .andDo(print())
                        .andReturn();
        System.out.println(result);
    }

    @Test
    @Order(2)
    public void insertTest() throws Exception {
        var insertInfo = new InsertMerchantReq();
        var result =
                mockMvc.perform(
                                MockMvcRequestBuilders.post("/junit")
                                        .headers(httpHeaders)
                                        .accept(MediaType.APPLICATION_JSON)
                                        .contentType(MediaType.APPLICATION_JSON_VALUE)
                                        .content(JsonUtil.toJson(insertInfo)))
                        .andExpect(status().isOk())
                        .andDo(print())
                        .andReturn();
        System.out.println(result);
    }

    @Test
    @Order(3)
    public void updateTest() throws Exception {
        Integer id = 1;
        var insertInfo = new InsertMerchantReq();
        var result =
                mockMvc.perform(
                                MockMvcRequestBuilders.put("/junit/{id}", id)
                                        .headers(httpHeaders)
                                        .accept(MediaType.APPLICATION_JSON)
                                        .contentType(MediaType.APPLICATION_JSON_VALUE)
                                        .content(JsonUtil.toJson(insertInfo)))
                        .andExpect(status().isOk())
                        .andDo(print())
                        .andReturn();
        System.out.println(result);
    }

    @Test
    @Order(4)
    public void deleteTest() throws Exception {
        Integer id = 1;
        var result =
                mockMvc.perform(
                                MockMvcRequestBuilders.delete("/junit/{id}", id)
                                        .headers(httpHeaders))
                        .andExpect(status().isOk())
                        .andDo(print())
                        .andReturn();
        System.out.println(result);
    }
}
2022-09-14 16:58:08.970 INFO  controller.JUnitControllerTest - ------ @BeforeAll ------

2022-09-14 16:58:27.045 INFO  controller.JUnitControllerTest - ------ @BeforeEach ------
2022-09-14 17:05:54.559 DEBUG backstage.controller.JUnitController - ====> list
2022-09-14 16:58:27.915 INFO  controller.JUnitControllerTest - ------ @AfterEach ------

2022-09-14 17:05:54.626 INFO  controller.JUnitControllerTest - ------ @BeforeEach ------
2022-09-14 17:05:54.650 DEBUG backstage.controller.JUnitController - ====> info
2022-09-14 17:05:54.656 INFO  controller.JUnitControllerTest - ------ @AfterEach ------

2022-09-14 17:05:54.671 INFO  controller.JUnitControllerTest - ------ @BeforeEach ------
2022-09-14 17:05:54.810 DEBUG backstage.controller.JUnitController - ====> insert
2022-09-14 17:05:54.814 INFO  controller.JUnitControllerTest - ------ @AfterEach ------

2022-09-14 17:05:54.824 INFO  controller.JUnitControllerTest - ------ @BeforeEach ------
2022-09-14 17:05:54.836 DEBUG backstage.controller.JUnitController - ====> update
2022-09-14 17:05:54.839 INFO  controller.JUnitControllerTest - ------ @AfterEach ------

2022-09-14 17:05:54.852 INFO  controller.JUnitControllerTest - ------ @BeforeEach ------
2022-09-14 17:05:54.860 DEBUG backstage.controller.JUnitController - ====> delete
2022-09-14 17:05:54.863 INFO  controller.JUnitControllerTest - ------ @AfterEach ------

2022-09-14 16:58:28.306 INFO  controller.JUnitControllerTest - ------ @AfterAll ------

前往
前往