buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

junit结合spring-test里的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

 

posted on 2022-03-01 23:33  buguge  阅读(484)  评论(0编辑  收藏  举报