SpringBoot项目-单元测试坑-Header value must not be null

第一步:问题原因
  • 此问题是由于设置了跨域请求拦截器导致的问题。
@Log4j2
public class CorsInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {


        //这里可以不加,但是其他语言开发的话记得处理options请求
        /**
         * 非简单请求是对那种对服务器有特殊要求的请求,
         * 比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。
         * 都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,
         * 服务器允许之后,浏览器会发出正式的XMLHttpRequest请求
         */
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
            return true;
        }

        //表示接受任意域名的请求,也可以指定域名  * 代表全部  这里要注意,如果request.getHeader("origin")为空,会报错。
        String origin = request.getHeader("origin");
        // ----------------------看这里-------------------------就是这里已经加了异常处理。
        if(StringUtils.isEmpty(origin)){
           log.error("此请求的origin={},默认为【*】,已经自动设置为【*】",origin);
           origin = "*";
        }
        response.setHeader("Access-Control-Allow-Origin", origin);

        //该字段可选,是个布尔值,表示是否可以携带cookie
        response.setHeader("Access-Control-Allow-Credentials", "true");

        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");

        response.setHeader("Access-Control-Allow-Headers", "*");

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

第二步:解决方案

  • 解决方案有两种,第一种就是在拦截器里面做判断。第二种是在MvcMock请求的时候加上origin的值。
/**
 * 类描述:
 *
 * @author superMan
 * @date 2021/5/14 09:51
 */
@Log4j2
@SpringBootTest(classes = {QcpApplication.class}) // 启动整个springBoot工程
@RunWith(SpringRunner.class)
public class AuthUserTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;
    @Autowired
    private AuthUserService authUserService;

    @Test
    public void loginServiceTest(){
        AuthUser user = new AuthUser();
        user.setTelephone("13211112222");
        user.setPassword("123456");
        HashMap<String, String> res = authUserService.login(user);
        log.error(res);
    }

    @Before
    public void setupMockMvc(){
        log.error("setupMockMvc");
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();

    }
    @Test
    @Transactional //开启事务功能
    @Rollback //  事务回滚,默认是true
    public void loginControllerTest() throws Exception {
        HashMap<String,String> hm = new HashMap<>();
        hm.put("email","33337@qq.com");
        hm.put("password","1123123");
        ResultActions resultActions = mockMvc.perform(
                MockMvcRequestBuilders
                        .post("/api/v1/pri/user/login")
                        // ----------------------------看这里------------------------------
                        .header("origin","*")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(JSON.toJSONString(hm))
                        .accept(MediaType.APPLICATION_JSON)

        );
        // 设置响应值编码,否则中文会乱码。
        resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");
        resultActions.andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("20000"));
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值