spring boot单元测试之十一:给带有filter的controller做单元测试(spring boot 2.4.4)
2023-09-14 09:01:18 时间
一,演示项目的相关信息
1,地址:
https://github.com/liuhongdi/filtertest
2,功能:演示给带有filter的controller做单元测试
3,项目结构:如图:
说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest
对应的源码可以访问这里获取: https://github.com/liuhongdi/
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,java代码说明
1,filter/TimeFilter.java
public class TimeFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("----------------time filter init"); } //过滤功能,我们统计请求所花费的时间 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("----------------time filter doFilter begin"); HttpServletRequest request = (HttpServletRequest) servletRequest; String path = request.getRequestURI(); String v = request.getParameter("v"); System.out.println("filter: v: "+v); if (v == null || v.equals("")) { ServletUtil.printString("缺少参数"); return; } String method = request.getMethod(); System.out.println("filter: method: "+method); //if () long startTime = System.currentTimeMillis(); filterChain.doFilter(servletRequest,servletResponse); long endTime = System.currentTimeMillis(); System.out.println("timefilter: "+path + " costtime: "+ (endTime-startTime) +"ms "); System.out.println("----------------time filter doFilter end"); } @Override public void destroy() { System.out.println("----------------time filter destroy"); } }
2,util/ServletUtil.java
public class ServletUtil { //获取request public static HttpServletRequest getRequest() { return getRequestAttributes().getRequest(); } //获取response public static HttpServletResponse getResponse() { return getRequestAttributes().getResponse(); } //获取session public static HttpSession getSession() { return getRequest().getSession(); } //获取ServletRequestAttributes public static ServletRequestAttributes getRequestAttributes() { RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); return (ServletRequestAttributes) attributes; } //得到当前的url地址 public static String getUrl() { HttpServletRequest request= getRequestAttributes().getRequest(); String ip = request.getRemoteAddr(); String url = request.getRequestURL().toString(); String param = request.getQueryString(); //System.out.println("param:"+param); String finalurl = ip+"--"+url; if (param != null) { finalurl= ip+"--"+url+"?"+param; } return finalurl; } //将字符串渲染到客户端 public static String printString(String string) { try { HttpServletResponse response= getResponse(); response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); //response.getWriter().print(string); PrintWriter out = response.getWriter(); //response.getWriter().print(resp); out.write(string); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } return null; } //判断请求是否是ajax public static boolean isAjax() { HttpServletRequest request= getRequest(); return (request.getHeader("X-Requested-With") != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With").toString())); } }
3,controller/HomeController.java
@Controller @RequestMapping("/home") public class HomeController { //示例controller,供统计时间用 @GetMapping("/home") @ResponseBody public String homeMethod(@RequestParam("v") String version) { System.out.println("controller v:"+version); try { Thread.sleep(1000); //延时1秒 } catch(InterruptedException e) { e.printStackTrace(); } return "this is home,v="+version; } }
4,config/DefaultMvcConfig.java
@Configuration @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) public class DefaultMvcConfig implements WebMvcConfigurer { //add filter //registration.addUrlPatterns("/icons/*", "/style/*", "/script/*", "/dwr/*", "/icons/*", "/coverArt.view", "/avatar.view"); //registration.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid2/*"); @Bean public FilterRegistrationBean addTimeFilterBean() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new TimeFilter()); registration.setName("timeFilter"); registration.setOrder(1); //请求中过滤器执行的先后顺序,值越小越先执行 registration.addUrlPatterns("/home/*","/abc/*"); return registration; } }
5,controller/HomeControllerTest.java
@AutoConfigureMockMvc @SpringBootTest class HomeControllerTest { @Autowired private HomeController homeController; @Autowired private MockMvc mockMvc; @Test @DisplayName("测试controller返回") void home1() throws Exception { MvcResult mvcResult = mockMvc.perform(get("/home/home?v=3") .contentType(MediaType.APPLICATION_FORM_URLENCODED)) .andReturn(); String content = mvcResult.getResponse().getContentAsString(); assertThat(content, equalTo("this is home,v=3")); } @Test @DisplayName("测试过滤器返回") void home2() throws Exception { MvcResult mvcResult = mockMvc.perform(get("/home/home") .contentType(MediaType.APPLICATION_FORM_URLENCODED)) .andReturn(); String content = mvcResult.getResponse().getContentAsString(); assertThat(content, equalTo("缺少参数")); } }
三,测试效果
四,备注
1,如果使用了FilterRegistrationBean引入fitler,
又同时在filter的类上加了@Component注解,
则使用mockmvc时会导致filter被执行两次
大家注意只使用一种引入方式
五,查看spring boot的版本:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.4.4)
相关文章
- Spring Boot特性
- ssm(Spring+Spring mvc+mybatis)
- Spring Boot Serverless 实战 | Serverless 应用的监控与调试
- spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)
- Spring boot后台搭建二集成Shiro权限控制
- 基于Gradle的spring boot 项目构建
- [Mockito] Spring Unit Testing with Mockito
- spring boot单元测试之七:用mockmvc模拟session(spring boot 2.4.3)
- spring boot:用swagger3生成接口文档,支持全局通用参数(swagger 3.0.0 / spring boot 2.3.2)
- spring boot:多个filter/多个interceptor/多个aop时设置调用的先后顺序(spring boot 2.3.1)
- spring boot日志框架体系剖析(默认采用logback作为日志框架)
- Spring boot应用如何支持https
- Spring Boot的自动配置、Command-line Runner
- Spring Boot:定制servlet filters
- junit与spring-data-redis 版本对应成功的
- Spring Boot 定时任务开启后,怎么符合条件自动停止?
- 【springboot系列】这样优化Spring Boot,启动速度快到飞起!
- 基于CSE的微服务架构实践-Spring Boot技术栈选型
- Spring Boot Test单元测试——Junit4、Junit5区别与@ExtendWith不识别生效问题解析
- spring boot 打包war后 部署到外部 tomcat 的具体正确操作【包括修改端口 与 去除请求路径的工程名】
- 毕业设计 Spring Boot的教师工作考核绩效管理系统(含源码+论文)
- spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
- Building Microservices with Spring Boot and Apache Thrift. Part 1 with servlet
- Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。
- 容器化 Spring Boot 代码的 9 个技巧
- Spring Cloud Alibaba-Nacos-创建服务消费者(Feign)
- Spring获取到bean的几种方式