`

48. spring boot单元测试restfull API【从零开始学Spring Boot】

阅读更多

 

 

回顾并详细说明一下在在之前章节中的中使用的@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 {

   privatelongid;

   private String name;

   private Integer age;

   // 省略settergetter

}

 

实现对User对象的操作接口

package com.kfit.controller;

 

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import com.kfit.demo.User;

 

@RestController

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

public class UserController {

   

    //这里为了方便测试,直接将数据存储在map中,实际请从数据库获取.

    private static Map<Long,User> users = Collections.synchronizedMap(new HashMap<Long,User>());

   

    /**

     * 返回所有的用户.

     * @return

     */

    @RequestMapping(value="", method=RequestMethod.GET)

    public List<User> getUserList() {

        // 处理"/users/"GET请求,用来获取用户列表

        // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递

        List<User> r = new ArrayList<User>(users.values());

        returnr;

    }

   

    @RequestMapping(value="/{id}", method=RequestMethod.GET)

    public User getUser(@PathVariable Long id) {

        // 处理"/users/{id}"GET请求,用来获取urlid值的User信息

        // url中的id可通过@PathVariable绑定到函数的参数中

        returnusers.get(id);

    }

   

    /**

     * post 保存用户.

     * @param user

     * @return

     */

    @RequestMapping(value = "",method=RequestMethod.POST)

    public String postUser(User user){

        // 处理"/users/"POST请求,用来创建User

        //@ModelAttribute User user

        // 除了@ModelAttribute绑定参数之外,还可以通过@RequestParam从页面中传递参数

        users.put(user.getId(), user);

        return"success";

    }

   

    /**

     * 使用put 进行更新用户.

     * @param id

     * @param user

     * @return

     */

    @RequestMapping(value="/{id}",method=RequestMethod.PUT)

    public String putUser(@PathVariable Long id,User user){

        // 处理"/users/{id}"GET请求,用来获取urlid值的User信息

         User u = users.get(id);

         u.setName(user.getName());

         u.setAge(user.getAge());

         users.put(id, u);

        return"success";

    }

   

    /**

     * 使用delete删除用户.

     * @param id

     * @return

     */

    @RequestMapping(value="/{id}", method=RequestMethod.DELETE)

    public String deleteUser(@PathVariable Long id) {

        // 处理"/users/{id}"DELETE请求,用来删除User

        // url中的id可通过@PathVariable绑定到函数的参数中

        users.remove(id);

        return"success";

    }

   

}

 

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

 

package com.kfit.demo;

 

import org.junit.Before;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.boot.test.SpringApplicationConfiguration;

import org.springframework.mock.web.MockServletContext;

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.result.MockMvcResultMatchers;

import org.springframework.test.web.servlet.setup.MockMvcBuilders;

 

import com.kfit.controller.UserController;

 

@RunWith(SpringJUnit4ClassRunner.class)

@SpringApplicationConfiguration(classes=MockServletContext.class)//MockServletContext.class

@WebAppConfiguration

public class UserControllerTest extends MockMvcResultMatchers{

   

    //模拟mvc对象类.

    private MockMvc mvc;

   

    @Before

    public void setup(){

       /*

        * MockMvcBuilders使用构建MockMvc对象.

        */

       mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();

    }

   

    @Test

    public void testUserController() throws Exception{

       RequestBuilder request = null;

       //1. get 以下user列表,应该为空》

   

       //1、构建一个get请求.

       request = MockMvcRequestBuilders.get("/users");

       mvc.perform(request)

           .andExpect(status().isOk())

           .andExpect(content().string("[]"))

           ;

       System.out.println("UserControllerTest.testUserController().get");

      

       // 2post提交一个user

       request = MockMvcRequestBuilders.post("/users")

                                   .param("id","1")

                                   .param("name","林峰")

                                   .param("age","20")

              ;

      

      

        mvc.perform(request).andExpect(status().isOk()).andExpect(content().string("success"));

 

       // 3get获取user列表,应该有刚才插入的数据

       request = MockMvcRequestBuilders.get("/users");

    mvc.perform(request).andExpect(status().isOk()).andExpect(content().string("[{\"id\":1,\"name\":\"林峰\",\"age\":20}]"));

      

      

       // 4put修改id1user

        request = MockMvcRequestBuilders.put("/users/1")

                .param("name", "林则徐")

                .param("age", "30");

        mvc.perform(request)

                .andExpect(content().string("success"));

       

        // 5get一个id1user

        request = MockMvcRequestBuilders.get("/users/1");

        mvc.perform(request)

                .andExpect(content().string("{\"id\":1,\"name\":\"林则徐\",\"age\":30}"));

      

       

       

     // 6del删除id1user

        request = MockMvcRequestBuilders.delete("/users/1");

        mvc.perform(request)

                .andExpect(content().string("success"));

 

        // 7get查一下user列表,应该为空

        request = MockMvcRequestBuilders.get("/users");

        mvc.perform(request)

                .andExpect(status().isOk())

                .andExpect(content().string("[]"));

       

    }

   

}

 

 

   至此,我们通过引入web模块(没有做其他的任何配置),就可以轻松利用Spring MVC的功能,以非常简洁的代码完成了对User对象的RESTful API的创建以及单元测试的编写。

 

 

  Spring Boot 系列博客】

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

 

网易云课堂视频最新更新

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

3、Spring Boot日志-log4j2

第十二章 Spring Boot 知识点2

1、spring boot 服务配置和部署

2、Spring Boot 定制URL匹配规则

 

 

历史章节

 

第一章 快速开始

1、Spring Boot之Hello World

2、Spring Boot之Hello World访问404

 

第二章 Spring Boot之JSON

1、spring boot返回json数据

2、Spring Boot完美使用FastJson解析JSON数据

 

第三章 Spring Boot热部署

1、Spring Boot热部署(springloader)

2、springboot + devtools(热部署)

 

第四章 Spring Boot数据库

1、Spring Boot JPA/Hibernate/Spring Data概念

2、Spring Boot JPA-Hibernate

3、Spring Boot Spring Data JPA介绍

4、Spring Boot JdbcTemplate

5、Spring Boot集成MyBatis

 

第五章 web开发

1、全局异常捕捉

2、配置server信息

3、spring boot使用thymeleaf

4、Spring Boot 使用freemarker

5、Spring Boot添加JSP支持

 

第六章 定时任务

1、Spring Boot定时任务

2、Spring Boot 定时任务升级篇(动态修改cron参数)

3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)

4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)

5、Spring Boot Quartz介绍

6、Spring Boot Quartz在Java Project中使用

7、Spring Boot 集成Quartz普通使用

8、Spring Boot 集成Quartz升级版

9、Spring Boot 集成Quartz二次升级版

10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象

 

第七章 Spring Boot MyBatis升级篇

1、Spring Boot MyBatis升级篇-注解

2、Spring Boot MyBatis升级篇-注解-自增ID

3、Spring Boot MyBatis升级篇-注解-增删改查

4、Spring Boot MyBatis升级篇-注解-分页查询

5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效

6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found

7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇

8、Spring Boot MyBatis升级篇-注解-@Result

9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:<script>

10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider

11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题

12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper

13、Spring Boot MyBatis升级篇-XML

14、Spring Boot MyBatis升级篇-XML-自增ID

15、Spring Boot MyBatis升级篇-XML-增删改查

16、Spring Boot MyBatis升级篇-XML-分页查询

17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效

18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)

19、Spring Boot MyBatis升级篇-XML-注解-初尝试

20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter

 

第八章 Spring Boot 知识点1

1、Spring Boot 拦截器HandlerInterceptor

2、Spring Boot启动加载数据CommandLineRunner

3、Spring Boot环境变量读取和属性对象的绑定

4、Spring Boot使用自定义的properties

5、Spring Boot使用自定义的properties

6、Spring Boot使用@SpringBootApplication

7、Spring Boot 监控和管理生产环境

 

第十章 Spring Boot 打包部署

1、Spring Boot打包部署((提供Linux的sh文件))

 

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

3、Spring Boot日志-log4j2

 

 

分享到:
评论
2 楼 林祥纤 2016-11-27  
k88520 写道
厉害厉害  我对spring mvc还没真的理解透彻 只是学习怎么使用  收获颇丰


这个是需要时间的。
1 楼 k88520 2016-11-23  
厉害厉害  我对spring mvc还没真的理解透彻 只是学习怎么使用  收获颇丰

相关推荐

    Spring Boot-RESTfull API入门.rar

    8. **测试(Testing)**:Spring Boot 提供了丰富的测试支持,包括单元测试、集成测试和端到端测试,可以使用 `@SpringBootTest`、`@WebMvcTest` 等注解进行测试。 9. **Swagger**:如果需要创建文档化的 API,可以...

    spring restfull 解决方案

    10. **测试**:Spring Boot提供了MockMvc工具,可以方便地对RESTful服务进行单元测试和集成测试。 通过学习和掌握以上知识点,你可以利用Spring Restful解决方案构建出高效、可维护的RESTful API,为客户端提供灵活...

    curso-produtos-API:Curso utilizando Spring Boot API RESTFULL e Java 8

    【标题】"curso-produtos-API:Curso utilizando Spring Boot API RESTFULL e Java 8" 描述了一门课程,该课程专注于使用Spring Boot构建RESTful API,并结合Java 8的特性进行开发。这门课程旨在帮助学员掌握如何...

    ponto-api:API Ponto-Sistema JAVA e Spring Boot实用程序APIRestfull

    ponto-api API Ponto-Sistema JAVA e Spring Boot实用程序APIRestfull

    SoccerApi:适用于https的Java Spring Boot Restfull Api

    足球阿皮 SoccerApi是Spring Boot rest Api,即 ( v2 )的实现。其余Api端点描述终点Football Data API(v2)端点参加所有比赛[ / competitions / ]通过ID获得竞争[ / competitions / {id} / ] 得到所有团队[ / ...

    springboot声明式缓存+jdbc+restfull接口 例子

    在本示例中,我们探讨的是如何在Spring Boot应用中集成声明式缓存、使用JDBC作为数据存储以及实现RESTful接口。Spring Boot是Java开发者的首选框架,因为它简化了设置和配置,使得快速开发变得可能。声明式缓存允许...

    二、RESTfull api.pdf

    从提供的文档内容来看,主要涉及了Milvus向量数据库的RESTful接口操作。Milvus是一种开源向量数据库,用于存储和处理向量数据,并支持AI和机器学习场景。文档中展示了如何通过RESTful API与Milvus服务器进行交互,...

    restfull+gradle+demo

    通过学习这个项目,你可以掌握如何配置Gradle构建脚本,使用Spring Boot和Spring Web创建Restful API,以及如何编写测试来验证API的行为。这是一项非常实用的技能,对于任何希望构建现代、可扩展的Web服务的开发者来...

    mavin spring4 mvc mybatis 整合 带事务,REST风格

    【标题】"mavin spring4 mvc mybatis 整合 带事务,REST风格" 涉及到的是一个基于Java技术栈的Web应用程序开发,整合了Maven、Spring4 MVC、MyBatis框架,并且实现了RESTful API设计以及事务管理。下面将对这些关键...

    spring-rest:一个简单的例子,Spring启动,微服务restfull

    在Spring Boot中,可以通过声明式服务发现(如Netflix Eureka)和API网关(如Zuul或Spring Cloud Gateway)来实现这一点。不过,对于简单的示例,我们通常只关注单一的应用服务。 为了运行此项目,你需要在本地拥有...

    spring-boot新手入门源码

    包含:bt1-mybatis-flywaydb、bt2-mybatis-transactional、bt3-mybatis-task、bt4-restfull、bt4-restfull、bt6-aop、bt7-statemachine、bt8-git-info、bt9-security、bt10-cache-redis

    FullStack-Angular-SpringBoot-eShop:使用Angular和SpringBoot的全栈Web应用程序(RestFull API)

    网上商店(eShop) 进行中... 使用Angular和SpringBoot(RestFull API)的全栈Web应用程序。二手技术和工具: 前端角度11 Bootstrap 4.6.0 后端Spring-Boot 2.4.3(Spring REST / Spring Data JPA) MySQL RDBMS

    lumen-doctrine-restfull-api-test:Laravel Restfull API测试任务

    Restfull API测试流明+教义ORM Restfull API测试任务版本号Lumen Framework 8.2.3 Laravel Doctrine ORM 1.7.4要求PHP 7.3 MySql 8.0安装克隆存储库启动Web服务器创建并设置与数据库的连接运行命令: ...

    Restfull_WedService_Repo

    Spring启动培训计划 文件夹1)-&gt; MicroServices Things。 文件夹2)-&gt; Spring Boot(静态)中的RestFull Api。 文件夹3)-&gt; Spring Boot中的RestFull Api(数据库)

    recipes-restfull:使用 Spring Boot MVC 和 JPA 的 Restfull 应用程序

    食谱-restfull 使用 Spring Boot MVC 和 JPA 的 Restfull 应用程序

    SpringMVC HelloWorld Restfull 项目

    - 使用 Spring Boot 可以简化项目的初始化和配置过程。 - 使用 Swagger UI 来文档化和测试 REST API,增强可维护性。 - 遵循 SOLID 原则和 DRY(Don't Repeat Yourself)原则编写代码,保持代码的可读性和可扩展...

    rest-test:用于测试 RESTFull API 的 DSL

    `rest-test`项目就是一个针对RESTful API的测试工具,它提供了DSL(领域特定语言)来简化测试编写。 DSL是一种为特定领域设计的语言,它允许开发者以更接近自然语言的方式来表达代码,使得代码更易读、易写。在`...

    大数据可视化之驾驶舱模式的实现.rar

    1. Spring Boot 轻量级HTTP应用:使用Spring Boot框架,搭建轻量级HTTP应用。提交可正常运行的Spring Boots工程打包文件(JAR); 2. Restfull服务接口定义及实现:定义Restfull服务接口,接口收到服务请求后返回前台...

    spring-boot-with-mysql-or-mssql:使用jwt,oauth2,mysql或mssql restfull api进行Spring启动

    使用jwt,oauth2,mysql或mssql restfull api进行Spring启动 当您想使用mysql时,将pom.xml中的application.yml与mysql mysql-connector-java 5.1.9一起使用 而当您想使用MSSql时,请在pom.xml ...

Global site tag (gtag.js) - Google Analytics