MockMvc启用Securtity验证和处理Response乱码问题

Java实战:MockMvc模拟HTTP请求测试 本文将详细介绍MockMvc模拟HTTP请求测试的技术,包括MockMvc的基本概念、使用场景、配置方法、常用API、参数绑定、响应处理等。文章将通过深入讲解MockMvc的核心知识,帮助我们掌握如何利用MockMvc进行高效的HTTP请求测试。 阅读详情

场景

针对于单元测试添加了MockMvcController层接口进行测试。
用的权限框架是Spring Securtity
问题:使用MockMvcController进行单元测试时直接略过了过滤器直接请求到对应的接口。

启用Securtity验证

现有实现

统一通过Before 创建 mockMvc 其它测试类直接使用该对象,代码如下:
@Before
public voidbefore() {
    //可以对所有的controller来进行测试
    mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}

测试用例

@SneakyThrows
@Test
public voidtestSearchMemberInfo() {
    String url = "/searchMemberInfo?uId=&name=";
    String result = mockMvc.perform(MockMvcRequestBuilders.get(url)
            .contentType(MediaType.APPLICATION_JSON_VALUE))
            .andReturn()
            .getResponse()
            .getContentAsString(StandardCharsets.UTF_8);
    log.info("返回结果 =>{}", result);
}
复制代
因为系统是需要登录的,那么这个测试用例的正常流程应该得先进行token验证,通过验证后才能正确调用该接口。
在网上找了很多帖子最后还是自己摸索出来的,网上的解决办法有两个:
1、添加 @WebMvcTest 注解(@WebMvcTest@SpringBootTest 不能同时使用。并且添加这个注解之后Securtity相关的bean就不会注入,只会扫描定义的控制类还有一些基础代码并不会启动完整的应用程序上下文,使用这个注解会报加载不到上下文错误)
2、在创建mockMvc对象的时候使用apply(SecurityMockMvcConfigurers.springSecurity()) 方式,可能是版本问题这个解决的帖子离现在有点时间也无法解决当前问题。

解决办法(思路)

网上找了很多资料,然后看了一下MockMvc提供的方法,就有一个addFilter() 方法然后就试了试,好家伙直接就可以用了,修改后 @Before 代码如下:
@Autowired
private Filter springSecurityFilterChain;

@Before
public voidbefore() {
    // 需要启用 Security 验证请使用这个
    mockMvc = MockMvcBuilders.webAppContextSetup(context)
                             .addFilter(springSecurityFilterChain)
                             .build();
}

加上 .addFilter() 直接就启用了拦截器亏我还上百度上谷歌搜了好多帖子都不行

解决Response乱码

开启验证后测试是没问题了,但返回打印的Response 内容中文乱码,处理办法在请求中设置字符集,在最后 .getContentAsString(StandardCharsets.UTF_8);
@SneakyThrows
@Test
public voidtestSearchMemberInfo() {
    String url = "/searchMemberInfo?uId=&name=";
    String result = mockMvc.perform(MockMvcRequestBuilders.get(url)
            .contentType(MediaType.APPLICATION_JSON_VALUE))
            .andReturn()
            .getResponse()
            .getContentAsString(StandardCharsets.UTF_8);
    log.info("返回结果 =>{}", result);
}
SpringBoot 整合spring security oauth2 后对资源提供接口进行测试 首先,spring security oauth2 这个东西简单来说就是访问接口的时候要在Authorization里带上一个access_token,生产环境下怎么获取这个token的话有四种方法,详情可以看看其他博客。这里就说下使用springboot、junit5的时候怎么用mockMvc来进行接口测试。 在main代码中,需要使用config来开启oauth2的各种组件,例如 如果想在测... 阅读详情

相关推荐

Mockito 的 MockMvc:零基础教程

MockMvcSpring Test 模块的一部分,它允许我们对 Spring MVC 控制器进行单元测试,而无需启动完整的 Spring 应用上下文。使用MockMvc,我们可以模拟 HTTP 请求响应,验证控制器是否按预期处理请求。简而言之,MockMvc 就像是一个虚拟的 SpringMVC,能够让我们快速测试控制器,就像在真实环境中一样。MockMvc 基于 Spring Test 模块,通过创建虚拟的 Spring MVC 环境,模拟 HTTP 请求响应。

洪晓鸿 4505

MockMvc单元测试

原始访问层代码 package com.example.demo.web; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Author: * @Date: 2018/...

菜鸟黑一枚 1220

SpringSecurity + MockMvc写单元测试(包括认证,授权,模拟Cookie)

SpringSecurity + MockMvc写单元测试(包括认证,授权,模拟Cookie)写在前面一、@WithMockUser,基于注解使用1.1、代码示例二、配置自定义Token2.1、代码示例关于MockMvc更详细的使用介绍参考这里,链接 写在前面 Spring Security 是一个权限控制框架,所有的接口都是基于当前用户角色,身份等,授权访问,在开发时,要先登陆,才能测试需要授权...

诗和远方,任重道远 6568

MockMvcResultHandlers打印结果中文乱码解决办法

使用MockMvc测试controller接口 测试主体 @Test void login() throws Exception { String contentAsString = mockMvc.perform(MockMvcRequestBuilders .post(new URI("/sys/login")) .contentType(MediaType.APPLICATION_JSON_VALUE)

段占彪的博客 4188

Spring Boot 单元测试中用Mock获取数据时中文出现乱码的解决方法

Springboot单元测试时,通过MockMvcRequestBuilders.post方法 request = get("/users/") .contentType(MediaType.APPLICATION_JSON); userMvc.perform(request) .andExpect(status().isOk()) .andExpect(content().string(

gba3455的博客 2400

spring boot mockMvc测试用例中文乱码

创建mockMvc,增加filter。

u014723730的博客 657

springboot项目编写测试类,乱码问题解决

Spring 的 CharacterEncodingFilter ​默认只对 POST 请求生效,对 GET 请求无效。MockMvc ​默认使用 ISO-8859-1 解码响应,而服务端实际返回 UTF-8 编码数据。在test的resources中添加application.properties配置文件,添加配置。Postman 无乱码是因浏览器自动识别编码,但 MockMvc 需显式配置。在测试代码中强制覆盖编码设置。测试环境需手动强制覆盖编码设置。​MockMvc 的默认行为​。

qq_39594281的博客 296

单元测试MockMvcResultHandlers.print()打印结果中body中文乱码问题处理

1、将返回的 response 使用 UTF-8编码。 ResultActions resultActions = planMvc.perform(request) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)); MockHttp

sg_knight的专栏 3537

关于MockHttpServletResponse默认字符编码是ISO-8859-1

3、为什么MockHttpServletResponse默认字符编码是ISO-8859-1?1、怎么让字符编码是常用的UTF-8呢?

weixin_43497184的博客 484

SpringBoot+Mock Mvc测试web接口增删改查、导入导出

使用Mock Mvc单元测试web接口的增删改查、导入、导出功能,涵盖登录 token header赋值等全流程。3,编写单元测试核心类。2,编写登录抽象父类。

thinkers 715

Spring Security(三十六):12. Spring MVC Test Integration

Spring Security provides comprehensive integration withSpring MVC Test Spring Security提供与Spring MVC Test的全面集成 12.1Setting Up MockMvc and Spring Security In order to use Spring Security with Spr...

weixin_30797027的博客 308

【测试】MockMvcResultHandlers.print()打印结果中body中文乱码

使用MockMvc做controller接口测试 @Test public void test() throws Exception { //请求参数 String requestInfo = "{ \"app_key\": \"*********\", \"cust_account\": \"********\",\"product_key\": \"*****\"}"; this.mockMvc .perfor

天。朝程序猿的专栏 2279

webclient请求返回乱码

官网正常 头信息 使用链接直接访问 webclient返回页面p.getWebResponse().getContentAsString()  打印出来乱码 解决办法: p.getWebResponse().getContentAsString("utf-8") 设置编码

dandanforgetlove的专栏 2460

springBoot 中文乱码问题分析,即统一utf8编码

最近在使用sprintBoot,发现中文乱码问题,所以这里记录一下。 乱码问题,很多问题都要从数据库、应用程序、客户端三个部分进行分析。 1、数据库编码设置 配置my.cnf: --在 [mysqld] 标签下加上三行 default-character-set = utf8 character_set_server = utf8 lower_case_table_names = 1 //...

zzhongcy的专栏 6774

HttpClient 流式读取时中文乱码的解决方法

1、非流式读取      HttpClient中可以之间使用HttpMethod的getResponseBodyAsString()方法获取返回的内容,在读取之前,如果需要做编码设置可以这样:      HttpMethod get=new GetMethod(url);   httpClient.executeMethod(get);   get.getParams().setCon

Dream It Possible 1万+

解决SpringMVC的请求、响应中的中文乱码

1、配置tomcat(版本大于8的请忽略着一步):打开tomcat文件目录–>conf–>server.xml–>找到下面代码–.添加URIEncoding=“UTF-8”(大概在67行)————————解决Get请求中文乱码 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/> 2、在你的springMVC项

aaasss7788的博客 636

mockMvcspring-security从SecurityContextHoolder获取SecurityContext

在使用mockMvcspring-security从SecurityContextHoolder获取SecurityContext为null 因为mockMvc覆盖了httpServletRequest的SecurityContext,详情见代码 void offline(String modelId) throws Exception { String tenant = "1000100100003"; //设置JWT到TenantContextHolder内,从

weixin_43260335的博客 976
上一篇: java生成二维码图片、转base64
下一篇: linux使用磁盘做内存交换区
骑电动车的小黄
博客等级 码龄9年 35粉丝 · 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值