From abb20843a728b8dcbaf37031fa2230d8ecf11ff5 Mon Sep 17 00:00:00 2001 From: Vks Date: Sun, 23 Feb 2025 18:04:57 +0800 Subject: [PATCH] REST API and related unit test --- .gitignore | 33 +++++++ Assignment1/backend/Assignments/pom.xml | 87 ++++++++++++++++++ .../Assignments/AssignmentsApplication.java | 15 ++++ .../Assignments/config/Swagger2Config.java | 6 ++ .../controller/UserController.java | 80 +++++++++++++++++ .../cyberlanting/Assignments/pojo/User.java | 12 +++ .../src/main/resources/application.yaml | 3 + .../AssignmentsApplicationTests.java | 88 +++++++++++++++++++ 8 files changed, 324 insertions(+) create mode 100644 .gitignore create mode 100644 Assignment1/backend/Assignments/pom.xml create mode 100644 Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/AssignmentsApplication.java create mode 100644 Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/config/Swagger2Config.java create mode 100644 Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/controller/UserController.java create mode 100644 Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/pojo/User.java create mode 100644 Assignment1/backend/Assignments/src/main/resources/application.yaml create mode 100644 Assignment1/backend/Assignments/src/test/java/com/cyberlanting/Assignments/AssignmentsApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/Assignment1/backend/Assignments/pom.xml b/Assignment1/backend/Assignments/pom.xml new file mode 100644 index 0000000..c335d47 --- /dev/null +++ b/Assignment1/backend/Assignments/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + + + com.cyberlanting + Assignments + 0.0.1-SNAPSHOT + Assignments + Assignments + + + + + + + + + + + + + + + 8 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + provided + + + + com.github.xiaoymin + knife4j + 3.0.2 + pom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/AssignmentsApplication.java b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/AssignmentsApplication.java new file mode 100644 index 0000000..0a02cc0 --- /dev/null +++ b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/AssignmentsApplication.java @@ -0,0 +1,15 @@ +package com.cyberlanting.Assignments; + +import com.spring4all.swagger.EnableSwagger2Doc; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@EnableSwagger2Doc +@SpringBootApplication +public class AssignmentsApplication { + + public static void main(String[] args) { + SpringApplication.run(AssignmentsApplication.class, args); + } + +} diff --git a/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/config/Swagger2Config.java b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/config/Swagger2Config.java new file mode 100644 index 0000000..875944d --- /dev/null +++ b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/config/Swagger2Config.java @@ -0,0 +1,6 @@ +package com.cyberlanting.Assignments.config; + +public class Swagger2Config { + + private ApiInfo admian +} diff --git a/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/controller/UserController.java b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/controller/UserController.java new file mode 100644 index 0000000..43401ab --- /dev/null +++ b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/controller/UserController.java @@ -0,0 +1,80 @@ +package com.cyberlanting.Assignments.controller; + +import com.cyberlanting.Assignments.pojo.User; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@RestController +@RequestMapping("/users") +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap()); + + /** + * 处理"/users/"的GET请求,用来获取用户列表 + * + * @return + */ + @GetMapping("/") + public List getUserList() { + // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递 + List r = new ArrayList(users.values()); + return r; + } + + /** + * 处理"/users/"的POST请求,用来创建User + * + * @param user + * @return + */ + @PostMapping("/") + public String postUser(@RequestBody User user) { + // @RequestBody注解用来绑定通过http请求中application/json类型上传的数据 + users.put(user.getId(), user); + return "success"; + } + + /** + * 处理"/users/{id}"的GET请求,用来获取url中id值的User信息 + * + * @param id + * @return + */ + @GetMapping("/{id}") + public User getUser(@PathVariable Long id) { + // url中的id可通过@PathVariable绑定到函数的参数中 + return users.get(id); + } + + /** + * 处理"/users/{id}"的PUT请求,用来更新User信息 + * + * @param id + * @param user + * @return + */ + @PutMapping("/{id}") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + /** + * 处理"/users/{id}"的DELETE请求,用来删除User + * + * @param id + * @return + */ + @DeleteMapping("/{id}") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} diff --git a/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/pojo/User.java b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/pojo/User.java new file mode 100644 index 0000000..dc3cd6f --- /dev/null +++ b/Assignment1/backend/Assignments/src/main/java/com/cyberlanting/Assignments/pojo/User.java @@ -0,0 +1,12 @@ +package com.cyberlanting.Assignments.pojo; + +import lombok.Data; + +@Data +public class User { + + private Long id; + private String name; + private Integer age; + +} diff --git a/Assignment1/backend/Assignments/src/main/resources/application.yaml b/Assignment1/backend/Assignments/src/main/resources/application.yaml new file mode 100644 index 0000000..3e272b0 --- /dev/null +++ b/Assignment1/backend/Assignments/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring: + application: + name: Assignments diff --git a/Assignment1/backend/Assignments/src/test/java/com/cyberlanting/Assignments/AssignmentsApplicationTests.java b/Assignment1/backend/Assignments/src/test/java/com/cyberlanting/Assignments/AssignmentsApplicationTests.java new file mode 100644 index 0000000..ad01079 --- /dev/null +++ b/Assignment1/backend/Assignments/src/test/java/com/cyberlanting/Assignments/AssignmentsApplicationTests.java @@ -0,0 +1,88 @@ +package com.cyberlanting.Assignments; + +import com.cyberlanting.Assignments.controller.UserController; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +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.RequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + + +import java.nio.charset.StandardCharsets; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +class AssignmentsApplicationTests { + + private MockMvc mvc; + + + @BeforeEach + public void setUp() { + mvc = MockMvcBuilders.standaloneSetup(new UserController()) + .defaultResponseCharacterEncoding(StandardCharsets.UTF_8) // 编码格式 + .addDispatcherServletCustomizer(dispatcher -> + dispatcher.setDispatchOptionsRequest(true)) + .build(); + } + + @Test + public void testUserController() throws Exception { + // 测试UserController + RequestBuilder request; + + // 1、get查一下user列表,应该为空 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[]"))); + + // 2、post提交一个user + request = post("/users/") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"id\":1,\"name\":\"测试大师\",\"age\":20}"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 3、get获取user列表,应该有刚才插入的数据 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"测试大师\",\"age\":20}]"))); + + // 4、put修改id为1的user + request = put("/users/1") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"name\":\"测试终极大师\",\"age\":30}"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 5、get一个id为1的user + request = get("/users/1"); + mvc.perform(request) + .andExpect(content().string(equalTo("{\"id\":1,\"name\":\"测试终极大师\",\"age\":30}"))); + + // 6、del删除id为1的user + request = delete("/users/1"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 7、get查一下user列表,应该为空 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[]"))); + + } + + +}