springboot对controller方法进行单元测试
单元测试有助于验证程序的执行逻辑是否正确。controller层的单元测试,已经和接口测试很类似了。执行单元测试以前,需要添加测试依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
1. 生成一个单元测试基础类
package com.demo.order.controller;import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;/*** */
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class BaseSpringBootTest {protected Logger logger = LoggerFactory.getLogger(BaseSpringBootTest.class);@Beforepublic void init() {logger.info("开始测试...");}@Afterpublic void after() {logger.info("测试结束...");}
}
注意需要添加的注解。
2. 没有参数的单元测试
package com.demo.order.controller;import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;/*** */
public class OrderControllerTest extends BaseSpringBootTest {@Autowiredprivate OrderController orderController;private MockMvc mockMvc;@Beforepublic void setup() {mockMvc = MockMvcBuilders.standaloneSetup(orderController).build();}@Testpublic void demo() throws Exception {MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/order/add")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();logger.info(mvcResult.getResponse().getContentAsString());}}
执行单元测试,可以看到如下输出:
2022-01-08 17:06:43.936 INFO 24860 --- [ main] c.f.order.controller.BaseSpringBootTest : 开始测试...
2022-01-08 17:06:43.962 INFO 24860 --- [ main] o.s.mock.web.MockServletContext : Initializing Spring TestDispatcherServlet ''
2022-01-08 17:06:43.962 INFO 24860 --- [ main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet ''
2022-01-08 17:06:43.962 INFO 24860 --- [ main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 0 ms
下单成功MockHttpServletRequest:HTTP Method = GETRequest URI = /order/addParameters = {}Headers = []Body = <no character encoding set>Session Attrs = {}Handler:Type = com.demo.order.controller.OrderControllerMethod = com.demo.order.controller.OrderController#add()Async:Async started = falseAsync result = nullResolved Exception:Type = nullModelAndView:View name = nullView = nullModel = nullFlashMap:Attributes = nullMockHttpServletResponse:Status = 200Error message = nullHeaders = [Content-Type:"text/plain;charset=ISO-8859-1", Content-Length:"12"]Content type = text/plain;charset=ISO-8859-1Body = Hello world!Forwarded URL = nullRedirected URL = nullCookies = []
2022-01-08 17:06:44.051 INFO 24860 --- [ main] c.f.order.controller.BaseSpringBootTest : Hello world!
2022-01-08 17:06:44.060 INFO 24860 --- [ main] c.f.order.controller.BaseSpringBootTest : 测试结束...
2022-01-08 17:06:44.081 INFO 24860 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
3. 有参数的单元测试(json格式)
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/secret/encryption").accept(MediaType.APPLICATION_JSON).param("originContent", "15221365094")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
这里的.accept(MediaType.APPLICATION_JSON).param("originContent", "15221365094"))就是增加json格式的参数。
4. 有参数的单元测试(对象转json)
MobileTelephoneRequest request = new MobileTelephoneRequest();request.setCustomerId("RL20180304000099");request.setMobileTelephone("18883270484");request.setCcfMobileTelephone("13904108866");MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/customerEncryption/save").contentType(MediaType.APPLICATION_JSON).content(JSONObject.toJSONString(request))).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
5. 一次性执行多个单元测试
package com.demo.order.controller;import org.junit.runner.RunWith;
import org.junit.runners.Suite;/*** 打包测试* 配置测试类,一次性执行所有配置的测试类*/
@RunWith(Suite.class)
@Suite.SuiteClasses({OrderControllerTest.class,DemoControllerTest.class})
public class SuiteExecuteTests {// 不用写代码,只需要注解即可(在SuiteClasses中配置测试类)
}
单元测试可以将程序启动和测试结合起来,一般用于开发和测试环境。这样就避免了必须借助于工具或者自己写代码构造http请求的繁琐。
springboot对controller方法进行单元测试相关推荐
- springboot项目访问不到controller方法。
问题描述:springboot项目访问不到controller方法. [分析] 应该是springboot并没有扫描到controller. [查看日志] 记录此时的日志输出 /Library/Jav ...
- SpringBoot对Controller进行单元测试【含乱码解决】(详细代码)
SpringBoot对Controller进行单元测试 Controller代码 单元测试代码 测试结果 乱码解决 Controller代码 package com.keafmd.controller ...
- springboot进行controller单元测试
单元测试在正规项目开发过程中是不可或缺的,像sonar之类的工具可以对项目代码的测试覆盖率都可以统计出来,从测试代码覆盖率上就可以从侧面反应出代码整体运行可能出问题的概率(不是一定),所以大型公司项目 ...
- SpringBoot使用MockMvc对Controller层进行单元测试
Mockito是GitHub上使用最广泛的Mocking框架.它提供简洁的API来测试.Mockito简单易学.可读性强.验证语法简洁. [示例]使用Mockito框架,对Controller层进行单 ...
- SpringBoot (6)---RestTemplate方法详解(2)
SpringBoot (6)---RestTemplate方法详解(2) 说明 上一篇SpringBoot 2.1 | 第三篇:RestTemplate请求HTTP(1)简单运用了RestTempla ...
- SpringBoot异步调用方法
SpringBoot异步调用方法 一.spring boot--使用异步请求,提高系统的吞吐量 https://blog.csdn.net/liuchuanhong1/article/details/ ...
- SpringBoot thymeleaf使用方法,thymeleaf模板迭代
SpringBoot thymeleaf使用方法,thymeleaf模板迭代 SpringBoot thymeleaf 循环List.Map ============================= ...
- SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器
SpringMVC入门(二)-- 参数的传递.Controller方法返回值.json数据交互.异常处理.图片上传.拦截器 参考文章: (1)SpringMVC入门(二)-- 参数的传递.Contro ...
- springboot获取getBean方法以及ApplicationContext空指针问题解决
springboot获取getBean方法以及ApplicationContext空指针问题解决 参考文章: (1)springboot获取getBean方法以及ApplicationContext空 ...
最新文章
- Loaded runtime CuDNN library: 7102 (compatibility version 7100) but source was compiled with 7004
- 给Xshell设置舒适的配色方案
- egg.js ajax上传文件,上传图片功能不会使用
- linux安装hadoop记录
- 2015c语言9月答案,2015年9月计算机二级C语言预测题答案
- C++(STL):08---vector元素访问
- Android之jni深入
- CTS(11)---android自动化测试CTS源码分析之一
- 20155229 2017-2018-1 《信息安全系统设计基础》课程总结
- Centos 6 编译安装 Apache 2.4
- 机器人学之动力学笔记【11】—— 拉格朗日 动力学方程
- 2021SC@SDUSC Zxing开源代码(十一)Data Matrix二维码(四)
- 距离度量 —— 杰卡德距离(Jaccard Distance)
- Xamarin iOS 切换开发者账号之后的签名标识和预配配置文件更新方法
- JS逆向 2021-8-16 网易云音乐 params、encSecKey参数
- 【STM32】标准库-以太网外设-LAN8720A-LWIP-无操作系统
- 嵌入式Linux从入门到精通之第八节:GTK+详解
- Weex在千牛开放中的应用实践
- 硬核干货合集!500+篇Java干货技术文章整理|资源|书单|工具|面试指南|强烈建议打开!
- t5810做虚拟服务器,戴尔Precision T5810工作站选用CPU的问题 | 小迪的生产力工具室...