Spring Boot 單元測試 === #### pom.xml ```xml= <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` #### 測試類 ```java= @SpringBootTest @TestMethodOrder(MethodOrderer.OrderAnnotation.class)// 讓測試方法依照@Order註解依序執行 @Transactional// 此類下所有測試方法都會回滾(@BeforeAll和@AfterAll不會) @AutoConfigureMockMvc // 可以Autowired MockMvc @TestInstance(Lifecycle.PER_CLASS)// 加這註解 @BeforeAll @AfterAll 才可用非靜態方法 class DemoTests { @Autowired private MockMvc mockMvc; @Autowired private UserRepository userRepository; @Autowired private UserService userService; private DemoUser demoUserA = new DemoUser(); private DemoUser demoUserB = new DemoUser(); private DemoUser demoUserC = new DemoUser(); private DemoUser demoUserD = new DemoUser(); @BeforeAll// 第一個測試開始前會執行 // @BeforeEach // 每個測試方法開始前皆會執行 void init() {// 寫入測試資料 demoUserA.setUserName("單元測試人員A"); demoUserA.setAge(10); demoUserB.setUserName("單元測試人員B"); demoUserB.setAge(20); demoUserC.setUserName("單元測試人員C"); demoUserC.setAge(30); demoUserD.setUserName("單元測試人員D"); demoUserD.setAge(40); userRepository.saveAll(Arrays.asList(demoUserA, demoUserB, demoUserC, demoUserD)); } @Test @Order(0) void testRepository() { DemoUser demoUser = userRepository.findById(demoUserA.getUserId()).orElseThrow(); Assert.assertEquals(demoUser, demoUserA); } @Test @Order(1) void testService() { DemoUser demoUser = userService.getOne(demoUserC.getUserId()); Assert.assertEquals(demoUser, demoUserC); } @Test @Order(2) void testAdd() throws Exception { DemoUser demoUser = new DemoUser(); demoUser.setUserName("單元測試人員"); demoUser.setAge(100); mockMvc.perform(post("/demo") .content(JsonUtil.convertObjectToJsonString(demoUser)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("userId", notNullValue())) .andDo(print()); } @Test @Order(3) void testDelete() throws Exception { mockMvc.perform(delete("/demo/{userId}", demoUserB.getUserId()).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("userId", is(demoUserB.getUserId()))) .andDo(print()); } @Test @Order(4) void testGetAll() throws Exception { mockMvc.perform(get("/demo/getAll")) .andExpect(status().isOk()) // 斷言 array .andExpect(jsonPath("$.length()", is(4))) .andExpect(jsonPath("$.[0].userId", is(demoUserA.getUserId()))) .andExpect(jsonPath("$.[0].userName", is(demoUserA.getUserName()))) .andExpect(jsonPath("$.[0].age", is(demoUserA.getAge()))) .andExpect(jsonPath("$.[1].userId", is(demoUserB.getUserId()))) .andExpect(jsonPath("$.[1].userName", is(demoUserB.getUserName()))) .andExpect(jsonPath("$.[1].age", is(demoUserB.getAge()))) .andExpect(jsonPath("$.[2].userId", is(demoUserC.getUserId()))) .andExpect(jsonPath("$.[2].userName", is(demoUserC.getUserName()))) .andExpect(jsonPath("$.[2].age", is(demoUserC.getAge()))) .andExpect(jsonPath("$.[3].userId", is(demoUserD.getUserId()))) .andExpect(jsonPath("$.[3].userName", is(demoUserD.getUserName()))) .andExpect(jsonPath("$.[3].age", is(demoUserD.getAge()))) .andDo(print()); } @Test @Order(5) void testGet() throws Exception { mockMvc.perform(get("/demo/{userId}", demoUserA.getUserId())) .andExpect(status().isOk()) .andExpect(jsonPath("userId", is(demoUserA.getUserId()))) .andExpect(jsonPath("userName", is(demoUserA.getUserName()))) .andExpect(jsonPath("age", is(demoUserA.getAge()))) .andDo(print()); } @Test @Order(6) void testUpdate() throws Exception { Map<String, Object> map = new HashMap<>(); map.put("userName", "測試人員E"); map.put("age", 50); mockMvc.perform(patch("/demo/{userId}", demoUserD.getUserId()) .content(JsonUtil.convertObjectToJsonString(map)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("userId", is(demoUserD.getUserId()))) .andDo(print()); mockMvc.perform(get("/demo/{userId}", demoUserD.getUserId())) .andExpect(status().isOk()) .andExpect(jsonPath("userId", is(demoUserD.getUserId()))) .andExpect(jsonPath("userName", is("測試人員E"))) .andExpect(jsonPath("age", is(50))) .andDo(print()); } @AfterAll// 測式全部結束後執行 // @AfterEach // 每個測試方法結束後皆執行 void afterTest() { userRepository.deleteAll(Arrays.asList(demoUserA, demoUserB, demoUserC, demoUserD));// 刪除測試資料 } ```