Springboot一:多环境配置、热部署、单元测试 MockMvc
1.Spring Boot Profile 多环境配置
我们在开发项目时,通常同一套程序会被发布到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、redis地 址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的 事。 对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要 打包的内容之后进行区分打包,而Spring Boot 就更简单了,打好包后,只需在不同的环境下启动时候指定读取的配置文件就可以了。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile} 值。
如:spring.profiles.active=test就会加载application-test.properties配置文件内容
1.1创建工程并创建多个配置文件
1.2每个环境的properties 设置branch分支的值
application.properties 默认dev
#默认使用dev的配置
spring.profiles.active=dev
application-dev.properties 端口8080
server.port=8080
branch=dev
application-test.properties 端口8081
server.port=8081
branch=test
application-prod.properties 端口8082
server.port=8082
branch=prod
1.3创建测试类的Controller
TestController.java
@RestController
@RequestMapping("/test")
public class HelloController {
@Value("${branch}")
private String branch;
@GetMapping("/branch")
public String test(){return "Spring Boot Current branch "+branch;
}
}
1.4 maven project clean install
打包成功
1.5 测试
进入到 jar同级执行 java -jar xxx.jar --spring.profiles.active=test
xxx:指的是你项目打包后jar包名称 --spring.profiles.active=test
启动制定执行哪个环境的properties
cd target
java -jar boot-lesson-4-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
cd target
java -jar boot-lesson-4-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
2 .Spring Boot devtools热部署
2.1创建工程
2.2 添加依赖POM.XML
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>
2.3配置plugin
加入 pligin 且配置一个属性 fork 为 true
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork></configuration></plugin></plugins></build>
2.4开启IDEA自动编译
选择 File | Settings | Compiler 命令,然后勾选 Build project automatically 复选框,低版本的 IDEA 请勾选 make project automatically 复选框。
IDEA 设置运行程中,允许自动编译
操作: ctrl + shift + alt + /,选择Registry,勾选勾上 Compiler autoMake allow when app running
2.5 手动触发编译
打开 edit configurations
找到 Running Application Update Policies---->On Update action 选择 Update classes and resources
按一下左下角的 Run 栏目中的 Update xxx application 才会触发热切换。也可以用快捷键 ctrl+F10
2.6 测试
1.编写测试类Controller
/*** @ClassName: TestController* TODO:类文件简单描述* @Author: kiell* @UpdateUser: kiell* @Version: 0.0.1*/
@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/hello")public String hello(){return "Hello World!!!!!";}
}
2.修改返回内容后不重启再次访问
3. Spring Boot 单元测试 MockMvc
3.1为何使用MockMvc?
对模块进行集成测试时,希望能够通过输入 URL 对 接口进行测试,如果通过启动服务器,建立http client进行 测试,这样会使得测试变得麻烦,假如我们的项目启动速度慢、网络环境差,这样就会造成我们的测试效率底下而且由于网络的原因 出现一些不可描述bug。所以为了方便我们对接口的测试,我们引入了 MockMVC。 MockMvc 实现了对 Http 请求的模拟,能够直接 转换到 接口的调用,而且不依赖网络环境,还提供了一套验证的工具,这样我们就能直观的看到认证的结果,大大提高了我们的自测 效率。
3.2 使用
1.我们怎么使用MockMvc 呢?
1. MockMvcBuilder构造MockMvc的构造器
2. mockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务处理逻辑
3. perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式
4. 使用StatusResultMatchers对请求结果进行验证
5. 使用ContentResultMatchers对请求返回的内容进行验证
2. MockMvcBuilder
MockMvc是spring测试下的一个非常好用的类,他们的初始化需要在setUp中进行。 MockMvcBuilder是用来构造MockMvc的构造器 MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相 应的控制器并得到相应的MockMvc
3.MockMvcRequestBuilders
从名字可以看出,RequestBuilder用来构建请求的,主要的api有:
MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据 uri 模板和 uri 变量值得到一个GET请求方式 的RequestBuilder,如果在controller的方法中method选择的是RequestMethod.GET,那在 mockMvc 单元测试中对应就要使用 MockMvcRequestBuilders.get。后续的post、put、deleted、等请求方式以此类推。
4.ResultActions
调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions,对ResultActions有以下三种处理:
1. ResultActions.andExpect:添加执行完成后的断言。添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;
2. ResultActions.andDo:添加一个结果处理器,比如此处使用.andDo(MockMvcResultHandlers.print())输出整个响应结果信 息,可以在调试的时候使用。
3. ResultActions.andReturn:表示执行完成后返回相应的结果
3.3 Demo
1.创建工程
2. 创建java Bean
/**
* @ClassName: UserInfo
* TODO:类文件简单描述
* @Author: kiell
* @UpdateUser: kiell
* @Version: 0.0.1
*/
public class UserInfo {private String userId;private String name;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
3.创建接口
/*** @ClassName: MockMvcController* TODO:类文件简单描述* @Author: kiell* @UpdateUser: kiell* @Version: 0.0.1*/
@RestController
@RequestMapping("/test")
public class MockMvcController {@GetMapping("/user")public UserInfo getUser(@RequestParam(required = false) String name,@RequestParam(required = false) String userId){UserInfo userInfo=new UserInfo();userInfo.setName(name);userInfo.setUserId(userId);return userInfo;}@PostMapping("/user")public UserInfo getUser(@RequestBody UserInfo userInfo){return userInfo;}
}
4. 创建单元测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMockMvcApplicationTests {private MockMvc mockMvc;@Autowiredprivate WebApplicationContext context;@Beforepublic void setUp(){mockMvc= MockMvcBuilders.webAppContextSetup(context).build();}@Testpublic void contextLoads() {}@Testpublic void mockMvcGet()throws Exception{MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/test/user").contentType(MediaType.APPLICATION_JSON_UTF8).accept(MediaType.APPLICATION_JSON_UTF8).param("name", "zhangsan").param("userId", "211")).andDo(print()).andExpect(status().isOk()).andExpect(jsonPath("$.userId").value("985")).andExpect(jsonPath("$.name").value("zhangsan1")).andReturn();System.out.println(mvcResult.getResponse().getContentAsString());}@Testpublic void mockMvcPost()throws Exception{UserInfo userInfo=new UserInfo();userInfo.setUserId("985");userInfo.setName("lisi");ObjectMapper mapper=new ObjectMapper();ObjectWriter ow=mapper.writer().withDefaultPrettyPrinter();String json=ow.writeValueAsString(userInfo);MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/test/user").contentType(MediaType.APPLICATION_JSON_UTF8).content(json).accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print()).andExpect(jsonPath("$.userId").value("985")).andExpect(jsonPath("$.name").value("lisi")).andReturn();System.out.println(mvcResult.getResponse().getContentAsString());}}
5.测试
Springboot一:多环境配置、热部署、单元测试 MockMvc相关推荐
- 微服务架构编码构建 环境配置 热部署配置
下面有每一步详细步骤: 不懂的可以留言评论. 全部笔记 1.约定 > 配置 > 编码 2.IDEA新建project工作空间 2.1.微服务cloud整体聚合父工程Project 父工程步 ...
- SpringBoot 配置热部署
SpringBoot 配置热部署 先来说一说热部署具体有什么样的神奇作用? 再我们平常编写一个web项目时,都知道如果修改html或者jsp这些前端页面,我们浏览器刷新,是可以实时更新的.但是如果修改 ...
- 学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门
本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...
- Intellij IDEA 4种配置热部署的方法【转】【补】
热加载 热加载可以使代码修改后无须重启服务器,就可以加载更改的代码.(其实分java和非java代码,本处可以让java代码立即生效且不重启服务) 第1种:修改服务器配置,使得IDEA窗口失去焦点时, ...
- ieda 热部署_Idea配置热部署的详细教程
一.概念 热部署就是正在运行状态的应用,修改了他的源码之后,在不重新启动的情况下能够自动把增量内容编译并部署到服务器上,使得修改立即生效.热部署为了解决的问题有两个, 一是在开发的时候,修改代码后不需 ...
- Intellij IDEA 4种配置热部署的方法
热加载 热加载可以使代码修改后无须重启服务器,就可以加载更改的代码.(其实分java和非java代码,本处可以让java代码立即生效且不重启服务) 第1种:修改服务器配置,使得IDEA窗口失去焦点时, ...
- eclipse里面配置热部署,tomcat配置
tomcat热部署问题: 在开始上班之前,项目还很小.每个项目启动只要几秒钟,当时不觉得麻烦. 可是---------------------------------------------- 上班之 ...
- IDEA 配置热部署
IDEA 配置热部署 引言 步骤1 步骤2 步骤3 IDEA 旧版本 IDEA 新版本 热部署的缺点 总结 引言 平时如果我们修改了自己项目的代码后,都要重新运行启动类,才能使新的项目生效,配置了热部 ...
- 用IDEA新建一个springboard项目配置热部署解决AutoWired注解报错
1.新建Spring Boot项目 * 注意:项目名必须全部小写* 勾选一些需要的组建 我这里勾选了DevTools模块可以包含在任何项目中,它可以节省大量的时间. 和web模块还有链接数据库用的jd ...
- 【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...
最新文章
- 智能指针_auto_ptr2_学习笔记
- JavaScript精进篇
- linux 导入函数,共享库 – Linux ELF文件:如何获取属于导入函数的共享对象
- Surface Computing
- SpringBootController控制层接收参数的几种常用方式
- JS+CSS全力打造的一级横向滑动,二级竖向下拉综合菜单
- 翻译自 RedHat 文章:What is middleware? (什么是中间件?)
- Python使用UDP广播实现服务器自动发现
- notepad++查看16进制文件
- python基础教程3下载-Python基础教程第3版中国PDF电子书免费下载
- python网页抓取与按键精灵原理一样吗_独家 | 手把手教你用Python进行Web抓取(附代码)...
- 从命名风格等方面解读阿里巴巴 Java 代码规范
- windows server 2008r2下搭建***服务器
- 联想笔记本那些有手写功能_可以在屏幕上自由手写联想Android平板电脑的哪些软件?如何设置联想平板电脑的手写笔迹...
- 中介分析(二): 多重中介分析
- My Dad said
- 2021年全球及中国酒店行业发展现状及竞争格局分析,全球酒店行业景气度大幅回暖「图」
- HTML5实现手机QQ表情功能
- prcs6汉化补丁怎么替换_最新 | EndNote X9.2授权版+汉化
- 四百左右的蓝牙耳机有哪些?四百左右好用的蓝牙耳机推荐