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));// 刪除測試資料
}
```