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("[]")));   
}
}

参考资料

程序猿DD / SpringBoot-Learning

Spring Boot开发RESTful接⼝服务及单元测试的更多相关文章

  1. 使用Spring boot开发RestFul 风格项目PUT/DELETE方法不起作用

    在使用Spring boot 开发restful 风格的项目,put.delete方法不起作用,解决办法. 实体类Student @Data public class Student { privat ...

  2. Spring Boot 实现RESTful webservice服务端实例

    1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: fa ...

  3. Spring Boot 实现RESTful webservice服务端示例

    1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: fa ...

  4. 使用Spring MVC开发RESTful API

    第3章 使用Spring MVC开发RESTful API Restful简介 第一印象 左侧是传统写法,右侧是RESTful写法 用url描述资源,而不是行为 用http方法描述行为,使用http状 ...

  5. Spring Boot开发HTTPS协议的REST接口

    Spring Boot开发HTTP的REST接口流程在前文中已经描述过,见<SpringBoot开发REST接口>. 如需要支持HTTPS,只需要在如上基础上进行设置.修改/resourc ...

  6. Spring Boot 开发微信公众号后台

    Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台. 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前 ...

  7. 天天玩微信,Spring Boot 开发私有即时通信系统了解一下

    1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 ...

  8. spring boot 开发环境搭建(Eclipse)

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  9. Spring Boot 开发集成 WebSocket,实现私有即时通信系统

    1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 ...

随机推荐

  1. [Linux] Linux C编程一站式学习 Part.1

    C语言入门 程序基本概念 程序和编程语言 C语言--(编译器)--汇编语言--(汇编器)--机器语言(目标代码 / 可执行代码) 可移植 / 平台无关:平台指计算机体系结构或操作系统,或二者的组合.不 ...

  2. 详解Linux中的cat文本输出命令用法

    作系统 > LINUX >   详解Linux中的cat文本输出命令用法 Linux命令手册   发布时间:2016-01-14 14:14:35   作者:张映    我要评论   这篇 ...

  3. Linux单用户模式(修改密码、运行级别)方法详解

    很多新手当面对"忘记 root 账户密码导致无法登陆系统"这个问题时,直接选择重新系统.其实大可不必,我只需要进入 emergency mode(单用户模式)更新 root 账户的 ...

  4. GPIO端口上拉下拉 与 硬件图的上拉下拉

    硬件图上的上拉下拉: 没有触发时默认接到IO的是高电平就是上拉: 没有触发时默认接到IO的是低电平就是 下拉: (2)对应GPIO的配置 配置与你的外围电路息息相关: 比如下图: 你只能配置为上拉: ...

  5. Serializable_序列化详情

     概述 Java 提供了一种对象序列化的机制.用一个字节序列可以表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等信息.字节序列写出到文件之后,相当于文件中持久保存了一个对象的信 ...

  6. Assignment Problem的若干思考

      最近受到南京一个同学的push,又开始了博客园写作之旅.欢迎大家联系我做代码实现工作,QQ:1198552514.权当赚点生活费~ 我的研究也经常用的Assignment problem,而且很多 ...

  7. VMware虚拟机CentOS磁盘扩容

    版本信息: VMware Workstation 15 Pro  15.5.2 build-15785246, CentOS7 原虚拟机默认20G,安装东西多了,磁盘空间不够用, docker mys ...

  8. 数据库原理 第七章 数据库设计和ER模型

    第七章讲述一个E-R设计如何转换成一个关系模式的集合以及如何在该设计中找到某些约束. 1.概念设计定义了数据库中表示的实体.实体的属性.实体之间的联系,以及实体和联系上的约束 在设计一个数据库模型的时 ...

  9. scrapy异常状态码处理

    scrapy异常状态码处理 在setting.py中加入 scrapy  的 state 默认只处理200到300之间 # 403状态的响应不被自动忽略,对403 的响应做个性化处理 HTTPERRO ...

  10. linux ( crontab 定时任务命令)

    linux ( crontab 定时任务命令)    crontab 定时任务命令 linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工 ...