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. [2021BUAA软工助教]个人第一次阅读作业小结

    BUAA个人阅读作业小结 一.作业要求 https://edu.cnblogs.com/campus/buaa/BUAA_SE_2021_LR/homework/11776 二.评分规则 言之有物,按 ...

  2. Java_集合之一

    1.Collection集合 1.1数组和集合的区别[理解] 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用 ...

  3. 不融资、不上市、不快马圈地…“佛系”ZOHO的中国生意经

    来源:钛媒体 作者:秦聪慧 "技术比肩SAP.直追微软的这家25岁"非典型"国际大厂会继续佛系下去吗? ZOHO研发中心大楼 在中国,有家相对低调的"舶来&qu ...

  4. Linux中169.254.0.0/24的路由来自哪里

    在Linux中,发现每次系统启动时,都会将(169.254.0.0/16)路由启动并将其添加到路由表中.但是并不知道这条路由具有什么功能和它到底来自于哪里? [root@master01 ~]# ro ...

  5. [BD] Storm

    什么是实时计算 离线计算:批处理,代表MapReduce.Spark Core,采集数据Sqoop.Flume 实时计算:源源不断,代表Storm等,采集数据Flume 框架 Apache Storm ...

  6. Linux 内存 占用较高问题排查

    Linux 内存 占用较高问题排查 niuhao307523005 2019-04-24 14:31:55 11087 收藏 11展开一 查看内存情况#按 k 查看 free #按兆M查看 free ...

  7. 强哥jQuery学习笔记

    js对象: 1.js内置对象 2.js元素对象 3.jquery对象 js特效: 1.js元素对象 2.jQuery对象 jQuery学习: 1.核心函数 2.选择器 3.筛选 4.文档处理 5.属性 ...

  8. spec2006与spec2000的对比简要说明

    ec2006使用说明  2014-10-10 五 性能测试  benchmark 一.工具介绍 SPEC CPU 2006 benchmark是SPEC新一代的行业标准化的CPU测试基准套件.重点测试 ...

  9. TCP/IP协议三次握手_四次挥手

    TCP/IP协议 TCP是一种面向连接的端到端的可靠传输协议. TCP报头格式 三次握手的过程 一.客户端发送一个连接请求,发送一个随机数X,这时客户端的端口状态变为SYN_SENT状态. 二.服务端 ...

  10. MyBatis 全局配置文件详解(七)

    MyBatis 配置文件作用 MyBatis配置文件包含影响 MyBatis 框架正常使用的功能设置和属性信息.它的作用好比手机里的设置图标,点击这个图标就可以帮助我们查看手机的属性信息和设置功能.其 ...