• junit结合springtest里的MockMvc来测试SpringMvc接口方法


    如下是SpringMvc项目里的Controller

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * @Author: daysurprise
     * @Mote: 我于生命之中绽放, 犹如黎明中的花朵
     * @Desc: 服务商充值上账web接口
     */
    @Slf4j
    @RestController
    public class LevySeparateAccountingController {
    
        /**
         * 服务商充值上账回调
         *
         * @param request
         * @param response
         * @return
         */
        @RequestMapping(value = "/recharge/saveSyncReviewRecord.do", produces = "application/json;charset=UTF-8")
        public String rechargeAccountingCallBack(HttpServletRequest request, HttpServletResponse response) {
            response.setCharacterEncoding(ChannelConstant.CHARSET);
            String reqData = request.getParameter("reqData");
            log.info("###/rechargeAccountingCallBack 服务商充值上账回调加密参数:{}", reqData);
            String returnMsg = "SUCCESS";
            if (StringUtils.isEmpty(reqData)) {
                returnMsg = "同步充值参数为空";
                log.info("###/rechargeAccountingCallBack 服务商充值上账回调参数为空");
                return returnMsg;
            }
            try {
                ...
            } catch (ResponseException e) {
                log.error("###/rechargeAccountingCallBack 服务商充值上账, {}", e.getMessage());
                returnMsg = e.getMessage();
            } catch (Exception e) {
                log.error("###/rechargeAccountingCallBack 服务商充值上账回调异常:", e);
                returnMsg = "ERROR:".concat(ExceptionUtils.getMessage(e));
            }
            return returnMsg;
        }
    }

    重点来了,junit结合spring-test里的MockMvc来测试上面的http接口

    package com.emax.channel.webapp.modules.levypay;
    
    import com.emax.channel.webapp.BaseTest;
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.http.MediaType;
    import org.springframework.test.web.servlet.MockMvc;
    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;
    import org.springframework.web.context.WebApplicationContext;
    
    import java.util.List;
    
    public class LevySeparateAccountingControllerTest extends BaseTest {
        private final String secretKey = "DA17CC11D9A0F3FBC87A788036D260DF";
       
        @Reference
        private LevyMerchantRelationService levyMerchantRelationService;
    
        @Autowired
        private WebApplicationContext webApplicationContext;
    
        private MockMvc mockMvc;
    
        @Before
        public void setUp() {
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
    
        @Test
        public void testRechargeAccountingCallBack() throws Exception {
            Result<List<LevyMerchantRelationDTO>> list = levyMerchantRelationService.list(new LevyMerchantRelationDTO());
            LevyMerchantRelationDTO levyMerchantRelationDTO = list.getResult().get(0);
            
            SeparateAccountingCallBackDto dto = JSON.parseObject(json, SeparateAccountingCallBackDto.class);
            dto.setRechargeSource(RechargeSeparateModeEnum.OFFLINE_TRANSFER.getLevyValue());
            dto.setAccountId(levyMerchantRelationDTO.getBankMerId());
            dto.setAccName(levyMerchantRelationDTO.getMerName());
            dto.setInterfaceKey(levyMerchantRelationDTO.getInterfaceKey());
            
            String responseString = mockMvc
                    .perform(MockMvcRequestBuilders
                            .post("/recharge/saveSyncReviewRecord.do") //请求的url
                            .contentType(MediaType.APPLICATION_FORM_URLENCODED)   //数据的格式
                            .param("reqData", AESUtil.encryptData(JSON.toJSONString(dto), secretKey))  //添加参数
                    )
                    .andExpect(MockMvcResultMatchers.status().isOk())    //返回的状态是200
                    .andDo(MockMvcResultHandlers.print())    //打印出请求和相应的内容
                    .andReturn()
                    .getResponse()
                    .getContentAsString();
    
            System.out.println("----------------" + responseString);
    
        }
    }

    运行结果(支持debug调试,是不是很爽):

    2022-03-01 23:20:18.261[] [] [main] INFO  o.s.b.test.mock.web.SpringBootMockServletContext:444 - Initializing Spring TestDispatcherServlet ''
    2022-03-01 23:20:18.261[] [] [main] INFO  o.s.test.web.servlet.TestDispatcherServlet:524 - Initializing Servlet ''
    2022-03-01 23:20:18.304[] [] [main] INFO  o.s.test.web.servlet.TestDispatcherServlet:546 - Completed initialization in 42 ms
    
    2022-03-01 23:20:21.227[] [] [main] INFO  c.e.c.w.m.levypay.LevySeparateAccountingController:65 - ###/rechargeAccountingCallBack 服务商充值上账回调加密参数:/30ypqDTqnRkYEpcDz+hq19pmk0EZp8z8NnM8d1ygPDRSReJ73fFxy8Yj/3+ ukvPrvSuzIcJH/nEMB9Fst842Sz....(900 chars)
    
    MockHttpServletRequest:
          HTTP Method = POST
          Request URI = /recharge/saveSyncReviewRecord.do
           Parameters = {reqData=[/30ypqDTqnRkYEpcDz+hq19pmk0EZp8z8NnM8d1ygPDRSReJ73fFxy8Yj/3+ ukvPrvSuzIcJH/nEMB9Fst842Szj5i2/X8ergNZU6UCSTBWK6T1Qa1UhZtVV x23hduXEmyNkkCUxGolfjYyxgEqVX+M5oawC72iIEByWqlWFlrsxTFQJgXAv VJ0DPGgWDSwtpU9xlqpOSJv5fkawMToA3e9ytzo8oWrXQxVgELPB9KosRKyM IsN11tGWclh+3RxWB023788MlHj48ljAAXK67HhJH4/GUVNb0nYvBhzG9f1d QWJuOWkGQrKgj0IQqc2+voqc8sPxQxB4cLxPSyDVtP+b1av8Hdl8FkWu5mf1 Cb5GmE9T3PJIGGv6D62QEyBoLvxgy/6zYYT4o2r7MkndxBoWIAJ3oZ3c+g2r t/x6XEgu7qNcTI+P5imy2VU0YjOb52Mvb8RRWUiNWmlqVhNWOXdyAC8380+H WGQrQ4MroHxOxTtYkdloPW6WWgCWlRjJQ+qiXiNvZc2UYizWN27ua4UDlt4J 5UNg5tjBFnabh/xcJj6nvdKUU4k+5J/SwG801hwfrtvm8VnLnu7/+4phm6E9 CpGKWDoVG83E07DNUnwS0KyC7nxUBvXxZuzLsWzT4+u8COtxHo9LWtbgtbgr R9ZnE4ahYjZuaePGiP4PtytmJT3TAU96s1fgdEK8O35n+tatKDZHv44peg6M 8SD9LzlGRfIbPcomuSP3VgMwfN/2STjTmnVyacTx1XpkyE2itbxrTW4ywJ7R BltFwmhS1SurXlEL2Vp1uB6SgAVeADFWXhoOanojVyTFX76+ySYg]}
              Headers = [Content-Type:"application/x-www-form-urlencoded"]
                 Body = <no character encoding set>
        Session Attrs = {}
    
    Handler:
                 Type = com.emax.channel.webapp.modules.levypay.LevySeparateAccountingController
               Method = public java.lang.String com.emax.channel.webapp.modules.levypay.LevySeparateAccountingController.rechargeAccountingCallBack(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    
    Async:
        Async started = false
         Async result = null
    
    Resolved Exception:
                 Type = null
    
    ModelAndView:
            View name = null
                 View = null
                Model = null
    
    FlashMap:
           Attributes = null
    
    MockHttpServletResponse:
               Status = 200
        Error message = null
              Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"7"]
         Content type = application/json;charset=UTF-8
                 Body = SUCCESS
        Forwarded URL = null
       Redirected URL = null
              Cookies = []
    ----------------SUCCESS

    参考:

    https://blog.csdn.net/hanzl1/article/details/78983939
    https://jfinal.com/feedback/2089

  • 相关阅读:
    SendCloud邮件中为什么会显示代发
    话说TP框架里的Vendor这目录是干什么用的啊?类库扩展thinkphp3.1版本
    中国天气网-天气预报接口api
    微信公众号tp3.2放进Model无效,几种实例化的方法试过,还是提示无法提供服务
    dede标签:定义文件夹
    DEDECMS中的几个常见的自定义常量DEDEMEMBER等位置
    dede添加会员功能听语音
    ExecuteNonQuery()返回值
    第十七节:织梦做自定义表单在线预约的方法
    MONGODB的内部构造 FROM 《MONGODB THE DEFINITIVE GUIDE》
  • 原文地址:https://www.cnblogs.com/buguge/p/15953179.html
Copyright © 2020-2023  润新知