SpringBoot 构建RestFul API 含单元测试
相关博文:
首先,回顾并详细说明一下在快速入门中使用的
@Controller
、@RestController
、@RequestMapping
注解。如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容。@Controller
:修饰class,用来创建处理http请求的对象@RestController
:Spring4之后加入的注解,原来在@Controller
中返回json需要@ResponseBody
来配合,如果直接用@RestController
替代@Controller
就不需要再配置@ResponseBody
,默认返回json格式。@RequestMapping
:配置url映射
- Controller 层
package com.creditease.bsettle.crm.controller.user; import com.creditease.bsettle.crm.model.User;
import com.creditease.bsettle.crm.service.UserService;
import com.creditease.bsettle.crm.util.ResponseUtil;
import com.creditease.bsettle.monitor.base.controller.BaseCommonQueryController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map; @Slf4j
@RequestMapping(value = "/v1/users")
@RestController
public class UserControllerRestFulDemo extends BaseCommonQueryController<User>{ @Autowired
UserService userService; @RequestMapping(value = "",method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> pageList(HttpServletRequest request, @RequestParam Map<String, String> searchParams) {
Map<String, Object> maps = new HashMap<String, Object>();
try {
//TODO do something
//maps = userService.queryPage(searchParams);
} catch (Exception var4) {
log.error(var4.getMessage(), var4);
maps.put("retCode", Boolean.valueOf(false));
maps.put("retMessage", var4.getMessage());
} return maps;
} /**
* 根据用户ID 查询用户信息
* @param request
* @param id
* @return
*/
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
@ResponseBody
Map<String,Object> findUser(HttpServletRequest request,@PathVariable Long id) {
Map<String,Object> resultMap = ResponseUtil.createMap(true,"操作成功!");
try {
//TODO do something
/* User user = userService.findUserById(id);
resultMap.put("user",user);*/
}catch(Exception e){
log.error("findUserById is Exception !!! {} \n",e);
resultMap = ResponseUtil.createMap(false,"操作失败!"+e.getMessage());
}
return resultMap;
} /**
* 修改用户信息
* @param request
* @param user
* @param updateType 修改类型 1:修改密码 2:修改用户信息 3:修改用户状态
* @return
*/
@RequestMapping(value="/{id}", method = RequestMethod.PUT)
@ResponseBody
Map<String,Object> updateUserInfo(HttpServletRequest request,@ModelAttribute User user,@PathVariable Long id,
@RequestParam("updateType") int updateType){
Map<String,Object> resultMap = ResponseUtil.createMap(true,"操作成功!");
try{
//TODO do something
// userService.updateUser(user,updateType,id);
}catch (Exception e){
log.error("updateUserInfo is Exception !!! {} \n",e);
resultMap = ResponseUtil.createMap(false,"操作失败!"+e.getMessage());
}
return resultMap;
} /**
* 根据用户ID删除用户
* @param request
* @param id
* @return
*/
@RequestMapping(value="/{id}", method = RequestMethod.DELETE)
@ResponseBody
Map<String,Object> delUserById(HttpServletRequest request,@PathVariable Long id){
Map<String,Object> resultMap = ResponseUtil.createMap(true,"操作成功!");
try{
//TODO do something
//userService.delete(id);
}catch (Exception e){
log.error("delUserById is Exception !!! {} \n",e);
resultMap = ResponseUtil.createMap(false,"操作失败!"+e.getMessage());
}
return resultMap;
}
/**
* 保存用户信息
* @param request
* @param user
* @return
*/
@RequestMapping(value = "", method = RequestMethod.POST)
@ResponseBody
Map<String,Object> saveUserInfo(HttpServletRequest request, @ModelAttribute User user){
Map<String,Object> resultMap = ResponseUtil.createMap(true,"操作成功!");
try{
//TODO do something
//userService.save(user);
}catch (Exception e){
log.error("saveUserInfo is Exception !!! {} \n",e);
resultMap = ResponseUtil.createMap(false,"操作失败!"+e.getMessage());
}
return resultMap;
}
}
- View 层
- 根据查询条件获取user列表
$.ajax({
url: '../v1/users',
async: false,
type: 'GET',
dataType: 'json
data: {
//TODO
} ,
success: function(data) {
//TODO
}
});OR
$('#userTable').bootstrapTable({
method: 'GET',
url: '../v1/user',
dataType: 'json',
pagination: true,
pageList: [,,,],
pageNumber: ,
pageSize: ,
//singleSelect: true,
clickToSelect: true,
sidePagination: 'server',
queryParams: queryParams,
locale: 'zh-CN',
// 略
}) 获取ID为1 的用户
$.ajax({
url: '../v1/user/1',
type: 'GET',
dataType: 'json',
data: {
//TODO
},
success: function(data) {
//TODO
}
});更新用户ID为1 的用户信息
$.ajax({
url: '../v1/user/1',
type: 'PUT',
dataType: 'json',
data: {
//TODO new user data
},
success: function(data) {
//TODO
}
});删除用户ID为1的用户
$.ajax({
url: '../v1/user/1',
type: 'DELETE',
dataType: 'json',
data: {
//TODO other param
},
success: function(data) {
//TODO
}
});
- 测试用例
package com.creditease.bsettle.crm; import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /**
* @author mengfanzhu
* @Package com.creditease.bsettle.crm
* @Description:
* @date 5/19/17 10:40
* */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CrmApplication.class)
@WebAppConfiguration
public class UserServiceRestTest { @Autowired
private WebApplicationContext wac;
private MockMvc mvc; @Before
public void setUp() throws Exception {
// mvc = MockMvcBuilders.standaloneSetup(new UserControllerRestFulDemo()).build();
mvc = MockMvcBuilders.webAppContextSetup(wac).build();
} @Test
public void getUserList() throws Exception {
// 1、get查一下user列表
RequestBuilder request = MockMvcRequestBuilders.get("/v1/users")
.header("auth", "false")
.param("pageNumber", "")
.param("pageSize", "");
mvc.perform(request)
.andDo(print()) //print request and response to Console
.andExpect(status().isOk())
.andExpect(content().contentType("application/json;charset=UTF-8"));
} @Test
public void postUser() throws Exception {
// 2、post提交一个userRequestBuilder
RequestBuilder request = MockMvcRequestBuilders.post("/v1/user")
.header("auth","false")
.param("isModifyPassword","N")
.param("status","O")
.param("userName","testName"+System.currentTimeMillis())
.param("userLoginPassword","aaaa1234")
.param("mobile","")
.param("email","fjksdfj@11.com")
.param("crmEnterpriseId","");
mvc.perform(request)
.andDo(print()); } @Test
public void getUser() throws Exception {
// get获取user列表,应该有刚才插入的数据
RequestBuilder request = MockMvcRequestBuilders.get("/v1/user?mobile=13322221111")
.header("auth","false")
.param("pageNumber", "")
.param("pageSize", "");;
mvc.perform(request)
.andDo(print())
.andExpect(status().isOk());
} @Test
public void getUserById() throws Exception {
// get一个id为1的user
RequestBuilder request = MockMvcRequestBuilders.get("/v1/user/1")
.header("auth","false");
mvc.perform(request)
.andDo(print());
} @Test
public void putUserInfoById() throws Exception {
// put修改id为1358的user
RequestBuilder request = MockMvcRequestBuilders.put("/v1/user/1358")
.header("auth","false")
.param("updateType","")
.param("userName", "测试终极大师")
.param("email", "11111@qq.com");
mvc.perform(request)
.andDo(print()); } @Test
public void delUserInfoById() throws Exception {
//del删除id为1358的user
RequestBuilder request = MockMvcRequestBuilders.delete("/v1/user/1358")
.header("auth","false");
mvc.perform(request)
.andDo(print()); }
}
SpringBoot 构建RestFul API 含单元测试的更多相关文章
- Spring Boot构建RESTful API与单元测试
如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下相关的内容. @Controller:修饰class,用来创建处理http请求的对象 @RestController:Spr ...
- Spring Boot 2.x基础教程:构建RESTful API与单元测试
首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...
- SpringBoot构建RESTful API
1.RESTful介绍 RESTful是一种软件架构风格! RESTful架构风格规定,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对 ...
- springboot集成swagger2构建RESTful API文档
在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可 ...
- Springboot 如何加密,以及利用Swagger2构建Restful API
先看一下使用Swagger2构建Restful API效果图 超级简单的,只需要在pom 中引用如下jar包 <dependency> <groupId>io.springfo ...
- springmvc/springboot开发restful API
非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...
- 【快学springboot】2.Restful简介,SpringBoot构建Restful接口
Restful简介 Restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现 ...
- 使用 .NET Core 3.x 构建 RESTFUL Api
准备工作:在此之前你需要了解关于.NET .Core的基础,前面几篇文章已经介绍:https://www.cnblogs.com/hcyesdo/p/12834345.html 首先需要明确一点的就是 ...
- Spring Boot 入门系列(二十二)使用Swagger2构建 RESTful API文档
前面介绍了如何Spring Boot 快速打造Restful API 接口,也介绍了如何优雅的实现 Api 版本控制,不清楚的可以看我之前的文章:https://www.cnblogs.com/zha ...
随机推荐
- 浅谈个人对存储区域网络SAN的理解
存储区域网络SAN,是一种通过将网络存储设备和服务器连接起来的网络,提供计算机和存储设备间的数据传输.其中,SAN是独立于服务器系统之外的,拥有近乎无限的存储能力,通过利用光纤作为传输媒介,实现了高速 ...
- CSS文字过多显示省略号
CSS文字过多显示省略号 /*-webkit-line-clamp用来限制在一个块元素显示的文本的行数*/ .dot1{ width: 100%; display: -webkit-box; -web ...
- BZOJ 4004: [JLOI2015]装备购买
4004: [JLOI2015]装备购买 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1154 Solved: 376[Submit][Statu ...
- 【数论Day1】 最大公约数(gcd)题目
20170529-3数论_gcd 题解: http://www.cnblogs.com/ljc20020730/p/6919116.html 日期 序号 题目名称 输入文件名 输出文件名 时限 内存 ...
- Django入门项目实践(中)
4.用户账户 4.1 让用户能够输入数据 添加新主题 # untitled/learning_logs/forms.py from django import forms from .models i ...
- debian8.4 ibus中文输入法
安装IBus: # apt-get install ibus ibus-sunpinyin ibus-table-wubi 导入输入法: 在Activities->Applications-&g ...
- 个推用户画像产品(个像)iOS集成实践
最近业务方给我们部门提了新的需求,希望能构建精准用户画像.我们尝试使用的是个推(之前专门做消息推送的公司)旗下新推出的产品“个像·用户画像”.根据官方的说法,个像能够为APP开发者提供丰富的用户画像数 ...
- Java中多个异常的捕获顺序(多个catch)
import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IO ...
- [iOS]Xcode处理过时方法的警告
####强迫症的福利, 有的时候, 我们特别讨厌Xcode中的代码警告, 以下就是遇到各种警告的时候的处理方法:(后续会一直更新) 产生警告的原因: 某些方法废弃了, 会产生警告! 样式: 处理方法: ...
- Spring Mvc Web 配置拦截规则与访问静态资源 (三)
拦截规则配置 1. *.do <!-- Processes application requests --> <servlet> <servlet-name>app ...