SpringBoot学习系列 | 构建一个较为复杂的RESTful API以及单元测试

标签: springboot springboot restful springboot 单元测试 spring boot学习 spring boot restful
289人阅读 评论(0) 收藏 举报
分类:

首先,回顾并详细说明一下在快速入门中使用的@Controller@RestController@RequestMapping注解。如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容。

下面我们尝试使用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实体定义:

public class User { 

    private Long id; 
    private String name; 
    private Integer age; 

    // 省略setter和getter 

}


实现对User对象的操作接口

@RestController 
@RequestMapping(value="/users")     // 通过这里配置使下面的映射都在/users下 
public class UserController { 

    // 创建线程安全的Map 
    static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>()); 

    @RequestMapping(value="/", method=RequestMethod.GET) 
    public List<User> getUserList() { 
        // 处理"/users/"的GET请求,用来获取用户列表 
        // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递 
        List<User> r = new ArrayList<User>(users.values()); 
        return r; 
    } 

    @RequestMapping(value="/", method=RequestMethod.POST) 
    public String postUser(@ModelAttribute User user) { 
        // 处理"/users/"的POST请求,用来创建User 
        // 除了@ModelAttribute绑定参数之外,还可以通过@RequestParam从页面中传递参数 
        users.put(user.getId(), user); 
        return "success"; 
    } 

    @RequestMapping(value="/{id}", method=RequestMethod.GET) 
    public User getUser(@PathVariable Long id) { 
        // 处理"/users/{id}"的GET请求,用来获取url中id值的User信息 
        // url中的id可通过@PathVariable绑定到函数的参数中 
        return users.get(id); 
    } 

    @RequestMapping(value="/{id}", method=RequestMethod.PUT) 
    public String putUser(@PathVariable Long id, @ModelAttribute User user) { 
        // 处理"/users/{id}"的PUT请求,用来更新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/{id}"的DELETE请求,用来删除User 
        users.remove(id); 
        return "success"; 
    } 

}


下面针对该Controller编写测试用例验证正确性,具体如下。当然也可以通过浏览器插件等进行请求提交验证。

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MockServletContext.class) 
@WebAppConfiguration 
public class ApplicationTests { 

    private MockMvc mvc; 

    @Before 
    public void setUp() throws Exception { 
        mvc = MockMvcBuilders.standaloneSetup(new UserController()).build(); 
    } 

    @Test 
    public void testUserController() throws Exception { 
        // 测试UserController 
        RequestBuilder request = null; 

        // 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", "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") 
                .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("[]"))); 

    } 

}


至此,我们通过引入web模块(没有做其他的任何配置),就可以轻松利用Spring MVC的功能,以非常简洁的代码完成了对User对象的RESTful API的创建以及单元测试的编写。其中同时介绍了Spring MVC中最为常用的几个核心注解:@Controller,@RestController,RequestMapping以及一些参数绑定的注解:@PathVariable,@ModelAttribute,@RequestParam

转载自:springforall社区

查看评论

使用jMock辅助单元测试

使用jMock辅助单元测试作者:冰云 时间:2004-04-16联系:icecloud(AT)sina.comBlog:http://icecloud.51.netjMock是Junit的一个增强库。...
  • icecloud
  • icecloud
  • 2004-04-19 19:07:00
  • 3843

Spring Boot 构建一个RESTful Web服务

翻译地址:https://spring.io/guides/gs/rest-service/构建一个RESTful Web服务本指南将指导您完成使用Spring创建一个“hello world”RES...
  • yanlovehan
  • yanlovehan
  • 2017-03-13 16:27:44
  • 7428

使用Spring Boot开发Restful程序

使用Spring Boot开发Restful程序 一、简介 最近团队中Android和IOS的童鞋向我提出来一个要求,想学习一下服务端是如何开发的。我们的后端主要是用Spring MVC来实...
  • yzllz001
  • yzllz001
  • 2016-12-07 14:05:52
  • 22366

springboot restful风格

今天稍微研究了下rest,不是写代码,只是看文字。 是的,不是写代码,只是理解,rest不是框架,不像mvc是种框架,它就只是一个规范,一种理念,一种风格--这些都是笔者站在小白的高度得出的理解。 ...
  • wltsysterm
  • wltsysterm
  • 2017-04-01 18:25:36
  • 849

spring boot 实现Restful API

简单几步,在spring boot中实现Restful API
  • ClementAD
  • ClementAD
  • 2016-06-28 17:19:28
  • 13345

Spring Boot系列之三 RESTful风格API

简介 在使用Spring Boot构建RESTful风格API时,需要先了解什么是RESTful以及Spring中控制层的一些常用注解. 参考文章 RESTful架构理解 h...
  • gebitan505
  • gebitan505
  • 2017-04-12 16:05:03
  • 8202

Spring boot整合mybatis实现Restful服务demo

首先要声明,这个demo很大程度上参考了这篇文章: Springboot 实现 Restful 服务,基于 HTTP / JSON 传输 所以把它归为转载之列。 首先创建数据表并插入一条数据(数...
  • danengbinggan33
  • danengbinggan33
  • 2017-03-20 13:39:36
  • 2487

SpringBoot-创建RESTful风格的 http接口访问jpa 来操作数据库

1.开发工具IDE:Intellij Idea,数据库mysql(SpringBoot,创建RESTful 接口很方便,只要建立好数据模型,然后创建一个模型仓库接口就ok了)2.开始开发2.1项目目录...
  • r8l8q8
  • r8l8q8
  • 2017-08-04 20:41:02
  • 1659

Spring Boot-RESTful简单项目的快速搭建

一、搭建一个简单的RESTfull接口项目在搭建 Spring Boot-RESTful 项目之前,eclipse必须先安装 Spring Tool Suite工具 ,Spring Tool Sui...
  • liulihui1988
  • liulihui1988
  • 2017-09-13 11:06:26
  • 2658

SpringBoot学习(八)--SpringBoot中Restful最佳实践

版权声明:作者原创,转载请注明出处。 本系列文章目录地址:http://blog.csdn.net/u011961421/article/details/79416510 简介 RE...
  • u011961421
  • u011961421
  • 2018-03-01 19:29:25
  • 193
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 1622
    排名: 3万+
    博客专栏
    最新评论