https://www.jianshu.com/p/2e84bd5dc9d6 (基于spring-boot的应用程序的单元测试方案)
spring mock测试的时候,可以根据spring docs 和MockMvc应用结合起来自动生成接口api文档;
@RunWith(SpringRunner.class) @SpringBootTest public class SpringRestDocsCommTest { //公共参数 protected static final ParameterDescriptor REQUEST_ID = parameterWithName("id").description("数据ID,不能为空"); protected static final ParameterDescriptor REQUEST_PAGE_NUMBER = parameterWithName("pageNum").description("页码,第一页页码为1,默认值为1"); protected static final ParameterDescriptor REQUEST_PAGE_SIZE = parameterWithName("pageSize").description("页长,默认值为10"); protected static final FieldDescriptor REQUEST_OPT_LOCK = fieldWithPath("optLock").type("Integer").description("数据库乐观锁,不能为空"); //公共响应 protected static final FieldDescriptor RESPONSE_OPT_LOCK = fieldWithPath("optLock").type("Integer").description("数据库乐观锁"); protected static final FieldDescriptor RESPONSE_PAGE_NUMBER = fieldWithPath("pageNum").type("Integer").description("页码"); protected static final FieldDescriptor RESPONSE_PAGE_SIZE = fieldWithPath("pageSize").type("Integer").description("页长"); protected static final FieldDescriptor RESPONSE_SIZE = fieldWithPath("size").type("Integer").description("查询总数"); protected static final FieldDescriptor RESPONSE_START_ROW = fieldWithPath("startRow").type("Integer").description("初始行数"); protected static final FieldDescriptor RESPONSE_END_ROW = fieldWithPath("endRow").type("Integer").description("结尾行数"); protected static final FieldDescriptor RESPONSE_TOTAL = fieldWithPath("total").type("Integer").description("总数"); protected static final FieldDescriptor RESPONSE_PAGES = fieldWithPath("pages").type("Integer").description("总页数"); protected static final FieldDescriptor RESPONSE_PRE_PAGE = fieldWithPath("prePage").type("Integer").description("前页页数"); protected static final FieldDescriptor RESPONSE_NEXT_PAGE = fieldWithPath("nextPage").type("Integer").description("后页页数"); protected static final FieldDescriptor RESPONSE_IS_FIRST_PAGE = fieldWithPath("isFirstPage").type("Boolean").description("是否是第一页"); protected static final FieldDescriptor RESPONSE_IS_LAST_PAGE = fieldWithPath("isLastPage").type("Boolean").description("是否是最后一页"); protected static final FieldDescriptor RESPONSE_HAS_PRE_PAGE = fieldWithPath("hasPreviousPage").type("Boolean").description("是否还有前页"); protected static final FieldDescriptor RESPONSE_HAS_NEXT_PAGE = fieldWithPath("hasNextPage").type("Boolean").description("是否还有后页"); protected static final FieldDescriptor RESPONSE_NAV_PAGES = fieldWithPath("navigatePages").type("Integer").description("导航页码数"); protected static final FieldDescriptor RESPONSE_NAV_PAGE_NUMBER = fieldWithPath("navigatepageNums").type("Integer[]").description("所有导航页号"); protected static final FieldDescriptor RESPONSE_NAV_FIRST_PAGE = fieldWithPath("navigateFirstPage").type("Integer").description("导航第一页"); protected static final FieldDescriptor RESPONSE_NAV_LAST_PAGE = fieldWithPath("navigateLastPage").type("Integer").description("导航最后页"); protected static final FieldDescriptor RESPONSE_LAST_PAGE = fieldWithPath("lastPage").type("Integer").description("最后页数"); protected static final FieldDescriptor RESPONSE_FIRST_PAGE = fieldWithPath("firstPage").type("Integer").description("第一页数"); protected static final FieldDescriptor RESPONSE_CREATE_TIME = fieldWithPath("createTime").type("Date").description("创建时间"); protected static final FieldDescriptor RESPONSE_UPDATE_TIME = fieldWithPath("updateTime").type("Date").description("更新时间"); private String host = "localhost"; private int port = 8080; private String scheme = "http"; @Rule public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation(); protected MockMvc mockMvc; @Autowired protected ObjectMapper objectMapper; @Autowired private WebApplicationContext context; @Before public void setUp() { Snippet[] defaultSnippets = new Snippet[]{CliDocumentation.curlRequest(), CliDocumentation.httpieRequest(), HttpDocumentation.httpRequest(), HttpDocumentation.httpResponse(), PayloadDocumentation.requestBody(), PayloadDocumentation.responseBody(), HeaderDocumentation.requestHeaders()}; this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) .apply(documentationConfiguration(this.restDocumentation) .snippets().withTemplateFormat(TemplateFormats.asciidoctor()).withEncoding("UTF-8") .withDefaults(defaultSnippets) .and() .uris().withScheme(scheme).withHost(host).withPort(port) .and() ) .build(); } @Test public void test() { System.out.println("----SpringRestDocsTest:" + host + "---" + port + "---" + scheme); } }
具体的测试类生成如下:
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class UserRestServiceTest extends SpringRestDocsCommTest { @Test public void a_getUserList() throws Exception { MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("pageNum", "1"); params.add("pageSize", "5"); params.add("status", "0"); this.mockMvc.perform(get("/v1/users").params(params)) .andExpect(status().isOk()) .andDo(document("users-list", requestParameters( REQUEST_PAGE_NUMBER, REQUEST_PAGE_SIZE, parameterWithName("status").description("用户状态,可以为空")), responseFields( subsectionWithPath("list").type("System对象数组").description("用户列表,具体数据参考根据ID获取用户接口"), RESPONSE_PAGE_NUMBER, RESPONSE_PAGE_SIZE, RESPONSE_SIZE, RESPONSE_START_ROW, RESPONSE_END_ROW, RESPONSE_TOTAL, RESPONSE_PAGES, RESPONSE_PRE_PAGE, RESPONSE_NEXT_PAGE, RESPONSE_IS_FIRST_PAGE, RESPONSE_IS_LAST_PAGE, RESPONSE_HAS_PRE_PAGE, RESPONSE_HAS_NEXT_PAGE, RESPONSE_NAV_PAGES, RESPONSE_NAV_PAGE_NUMBER, RESPONSE_NAV_FIRST_PAGE, RESPONSE_NAV_LAST_PAGE/*, RESPONSE_LAST_PAGE, // 这2个参数在新版本已经被取消了 RESPONSE_FIRST_PAGE*/))); } @Test public void b_getUserById() throws Exception { this.mockMvc.perform( get("/v1/users/{id}", 1)) .andExpect(status().isOk()) .andDo(document("users-get", pathParameters(REQUEST_ID), responseFields( subsectionWithPath("id").type("Long").description("用户ID"), subsectionWithPath("name").type("String").description("用户姓名"), subsectionWithPath("age").type("Integer").description("用户年龄"), subsectionWithPath("status").type("Integer").description("用户状态"), subsectionWithPath("description").type("String").description("描述信息"), RESPONSE_CREATE_TIME, RESPONSE_UPDATE_TIME, RESPONSE_OPT_LOCK ))); }
相关推荐
Springs Boot 是一个基于 Java 的框架,提供了一个便捷的方式来开发基于 Spring 的应用程序。在开发过程中,测试是一个非常重要的步骤,单元测试和集成测试是其中的两种重要类型。本文将详细介绍 Spring Boot 中的...
- 学习如何对Spring Boot应用进行单元测试和集成测试。 ##### 三、使用Spring Boot **13. 构建系统** - **13.1. 依赖管理** - Spring Boot提供了默认的依赖版本管理,避免了版本冲突问题。 - **13.2. Maven** -...
Spring Boot是Spring框架的一个子项目,旨在简化Java应用程序的初始搭建以及开发过程,通过提供预配置的特性,如嵌入式Web服务器、自动配置、起步依赖等,极大地提高了开发效率。 本书首先会讲解Spring Boot 2的...
Spring Boot 是一个基于Java的开源框架,旨在简化Spring应用程序的搭建和开发。Spring Boot 2.5.0 是 Spring Boot 的一个版本,提供了许多新的特性和改进。下面是 Spring Boot 2.5.0 的一些关键特性和知识点: SSM ...
Spring Boot是Spring生态系统中的一个关键组件,它旨在简化Spring应用程序的初始搭建以及开发过程,使得开发者能够快速地创建独立运行的、生产级别的Java应用。 Spring Boot的核心特性包括自动配置、内嵌Web服务器...
《Spring+Boot实战》这本书是针对Java开发人员的一本实用指南,主要讲解如何高效地使用Spring Boot框架构建现代化的Web应用程序。Spring Boot以其简洁、快速的起步和开箱即用的特点,已经成为Java开发者构建微服务...
- 集成外部配置文件:介绍了如何在Spring Boot应用中导入和使用传统的Spring XML配置文件。 文档提供了Spring Boot的核心知识点和一些实用的案例,适用于Spring Boot的初学者和有经验的开发者。通过对这些知识点的...
在文档的“开始”部分,介绍了Spring Boot的基础知识,包括系统要求、安装方法以及如何创建和运行第一个Spring Boot应用。系统要求部分会详细说明支持的Servlet容器。Spring Boot安装包括了为Java开发者准备的安装...
Spring Boot以其简化Spring应用程序的初始设置和常规配置而闻名,极大地推动了Java开发的效率。本书英文版全面覆盖了Spring Boot的核心概念和技术,为读者提供了一个详尽的Spring Boot开发实践教程。 1. **Spring ...
Java 微服务实践-Spring Boot 测试是 Java 微服务实践的一部分,主要关注于 Spring Boot 应用程序的测试。测试是软件开发过程中的一个重要步骤,对确保软件的质量和可靠性起着至关重要的作用。本文将详细介绍 Spring...
`@SpringBootTest`注解可以启动整个Spring Boot应用进行集成测试,而`@DataJpaTest`则专门用于测试JPA仓库。 **8. Spring Cloud** Spring Boot与Spring Cloud的结合,使得构建分布式系统(如配置中心、服务注册与...
Spring Boot是由Pivotal团队开发的框架,旨在简化Spring应用程序的初始搭建以及开发过程。其核心特性包括自动配置、嵌入式服务器、健康检查和可绑定的命令行接口等,极大地提高了开发效率。 1. **自动配置**:...
Spring Boot是由Pivotal团队提供的全新框架,旨在简化Spring应用程序的初始搭建以及开发过程。该指南深入浅出地介绍了Spring Boot的核心特性,包括自动配置、起步依赖、命令行界面、内嵌Web服务器、健康检查、...
Spring Boot 2是Java开发领域中的一个热门框架,它由Pivotal团队开发,旨在简化Spring应用程序的初始搭建以及开发过程。Spring Boot的核心理念是“约定优于配置”,它通过默认配置来减少大量的XML配置文件,使得...
11. **测试**:Spring Boot为单元测试和集成测试提供了便利,如`@SpringBootTest`注解用于启动整个Spring Boot应用进行集成测试。 通过这份《Spring Boot核心技术-笔记-pdf版》的学习,你将能够深入理解Spring Boot...
文档内容包括了Spring Boot的介绍、系统要求、安装方式、如何创建和运行第一个Spring Boot应用程序、构建系统使用、代码结构组织、配置类和自动配置处理、Spring Beans和依赖注入、以及如何打包和部署应用等方面的...
在应用程序运行方面,文档介绍了多种运行应用程序的方法,包括从IDE中运行、作为打包后的应用运行、使用Maven和Gradle插件运行等,以及热交换功能,允许开发者在不重启应用的情况下替换或修改类文件。 为了更好地...
1. **快速入门**:介绍如何通过最小化配置快速启动一个新的Spring Boot应用,包括使用`spring-boot-starter`起步依赖和`main`方法创建可执行的JAR。 2. **核心特性**:详细解释Spring Boot的核心特性,如自动配置、...