Spring Boot开发RESTful接⼝服务及单元测试
Spring Boot开发RESTful接⼝服务及单元测试
常用注解解释说明:
- @Controller :修饰class,⽤来创建处理http请求的对象
- @RestController :Spring4之后加⼊的注解,原来在 @Controller 中返回json需要@ResponseBody 来配合,如果直接⽤ @RestController 替代 @Controller 就不需要再配置 @ResponseBody ,默认返回json格式。
- @RequestMapping :配置url映射
下⾯我们尝试使⽤Spring MVC来实现⼀组对User对象操作的RESTful API,配合注释详细说明在Spring MVC中如何映射HTTP请求、如何传参、如何编写单元测试。
RESTful API具体设计如下:
| 请求类型 | URL | 功能说明 |
|---|---|---|
| GET | /users | 查询用户列表 |
| POST | /users | 创建一个用户 |
| GET | /users/id | 根据ID查询一个用户 |
| PUT | /users/id | 根据ID更新一个用户 |
| DELETE | /users/id | 根据ID删除一个用户 |
User实体定义
package com.kingram.springboot.beans;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
}
接口实现
package com.kingram.springboot.controller;
import com.kingram.springboot.beans.User;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping(value = "/users")
public class UserController {
// 创建线程安全的Map
private static Map<Long, User> users = Collections.synchronizedMap(new HashMap<>());
@RequestMapping(value = "/", method = RequestMethod.GET)
public List<User> getUserList() {
List<User> r = new ArrayList<>(users.values());
return r;
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String postUser(@ModelAttribute User user) {
users.put(user.getId(), user);
return "success";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User getUser(@PathVariable Long id) {
return users.get(id);
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public String putUser(@PathVariable Long id, @ModelAttribute User user) {
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return "success";
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String deleteUser(@PathVariable Long id) {
users.remove(id);
return "success";
}
}
测试⽤例
package com.kingram.springboot;
import com.kingram.springboot.controller.UserController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.hamcrest.core.IsEqual.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;
@SpringBootTest
@DisplayName("Test UserController")
public class UserControllerTest {
private MockMvc mvc;
@BeforeEach
void setUp() {
mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
void testUserController() throws Exception {
RequestBuilder request;
// (1)get查⼀下user列表,应该为空
request = get("/users/");
mvc.perform(request).andExpect(status().isOk()).andExpect(content().string(equalTo("[]")));
// (2)post提交⼀个user
request = post("/users/").param("id", "1").param("name", "张三").param("age", "50");
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\":50}]")));
// (4)put修改id为1的user
request = put("/users/1").param("name", "李四").param("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("[]")));
}
}
参考资料
Spring Boot开发RESTful接⼝服务及单元测试的更多相关文章
- 使用Spring boot开发RestFul 风格项目PUT/DELETE方法不起作用
在使用Spring boot 开发restful 风格的项目,put.delete方法不起作用,解决办法. 实体类Student @Data public class Student { privat ...
- Spring Boot 实现RESTful webservice服务端实例
1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: fa ...
- Spring Boot 实现RESTful webservice服务端示例
1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: fa ...
- 使用Spring MVC开发RESTful API
第3章 使用Spring MVC开发RESTful API Restful简介 第一印象 左侧是传统写法,右侧是RESTful写法 用url描述资源,而不是行为 用http方法描述行为,使用http状 ...
- Spring Boot开发HTTPS协议的REST接口
Spring Boot开发HTTP的REST接口流程在前文中已经描述过,见<SpringBoot开发REST接口>. 如需要支持HTTPS,只需要在如上基础上进行设置.修改/resourc ...
- Spring Boot 开发微信公众号后台
Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台. 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前 ...
- 天天玩微信,Spring Boot 开发私有即时通信系统了解一下
1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 ...
- spring boot 开发环境搭建(Eclipse)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- Spring Boot 开发集成 WebSocket,实现私有即时通信系统
1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 ...
随机推荐
- Java_常用类API之一
Math类 Math类中包含一些对数据进行数学运算的方法,而该类中的方法全都是静态的.像这样的类称之为工具类. 1 public static int abs(int a) 2 对一个数据求绝对值 3 ...
- Unity shader 护盾shield的简单实现
先上效果图 shader所用的贴图资源 扰动 直接对uv进行变换就可以了,记得首先把六边形格子地图的Tilling调高点 先预先调成合适大小的六边形,然后repeat铺满整个护盾 // Tiles a ...
- 偷梁换柱:使用mock.patch辅助python单元测试
最近在搞软工项目的后端测试,重新复习了一下python的mock.patch,并用它简化了对一些复杂逻辑的测试,在此记录 问题描述 本组的项目比较特殊,设计对教务网站的模拟登陆与信息爬取,同时不少接口 ...
- PSP初体验:求交点
项目 内容 课程:北航2020春软件工程 博客园班级博客 作业:完成一个平面图形求交点的程序,体验PSP的过程 个人项目作业 我在这个课程的目标是 体验软件开发的全流程 这个作业在哪个具体方面帮助我实 ...
- CRM系统如何改善企业业务流程
工作流管理是CRM客户管理系统的一个重要功能.当企业进行业务管理和处理时,会有一套自己的工作流程.使用CRM系统,可以帮助企业改进整个工作流程,利用系统的流程设置模块,将各个部门所处理的活动定义为过程 ...
- [bug] PyCharm远程Spark集群:Java gateway process exited before sending its port number
原因 无法连接到集群上的java 解决 方法一: 在右上角Edit Configurations中,添加一条环境变量JAVA_HOME,值为远程机器上的java安装路径 方法二: 直接在代码里写上JA ...
- Samba服务配置及配置文件说明
前言 1.配置Samba服务为什么要关闭防火墙(firewalld)和Selinux? 在linux操作系统中默认开启了防火墙,Selinux也处于启动状态,一般状态为enforing:所以,在我们搭 ...
- Java JOptionPane 对话框
如果你对 Java 控制台界面下的输入数据和打印输出结果感到有些乏味和厌倦,希望能够像其他计算机软件一样有一个 GUI 界面(图形用户界面). 那么 JOptionPane 对话框也许会让你眼前一亮, ...
- Apache Jena Fuseki使用
下载Apache Jena Fuseki 先从apache官网下载fuseki压缩包.然后解压到目标文件夹. apache官网:http://jena.apache.org/download/ 这里我 ...
- eclispe--tomcat配置
eclipse安装tomcat方法: 1.下载tomcat,从官网下载,地址:http://tomcat.apache.org/download-70.cgi 2.将下载下来的压缩包解压,放在自己想放 ...