关于Spring中Controller的单元测试

第一次写对Controller的单元测试,在不了解的情况下被自己的无知给坑了,下面给出写法。


package com.alipay.marketingservice.action;

import com.alibaba.fastjson.JSON;
import com.alipay.marketingservice.util.ConstantManager;
import com.alipay.opbiservice.vo.UserVo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })
@ContextConfiguration(locations = "classpath:META-INF/spring/*.xml")
public class ExportActionTest {

    @Resource
    private MerchantAction merchantAction;
    @Resource
    private ExportAction exportAction;

    private MockMvc mockMvc;
    private MockMvc mockMvc2;
    private MockHttpSession session;

    @Before
    public void setUp(){
        mockMvc = MockMvcBuilders.standaloneSetup(merchantAction).build();
        mockMvc2 = MockMvcBuilders.standaloneSetup(exportAction).build();
        session = new MockHttpSession();
    }

    @Test
    public void test()throws Exception{
        //自定义request跳过权限检查
        UserVo userVo = new UserVo();
        List permission = new ArrayList();
        //在这里添加需要访问的权限接口
        permission.add("***_***");
        permission.add("***_get***");
        userVo.setPermission(permission);
        //设置session
        session.setAttribute("id", JSON.toJSONString(userVo));
        //设置时间
        Calendar calendar = Calendar.getInstance();
        calendar.set(2017, 7, 1);
        Long beginDate = calendar.getTimeInMillis();
        calendar.set(2017, 9, 1);
        Long endDate = calendar.getTimeInMillis();
        //通过接口获取商家名
        ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/***/get***.action").session(session).servletPath("/***/get***.action"));
        MvcResult mvcResult = resultActions.andReturn();
        String result1 = mvcResult.getResponse().getContentAsString();
        Map map0 = (Map) JSON.parse(result1);
        Map map = (Map) map0.get("data");
        if(map == null){
            System.out.println("没获取到商家");
        }
        Map<String, Object> map2 = ((List<Map<String, Object>>)map.get("mer**")).get(0);
        String id = (String) map2.get("id");
        String name = (String) map2.get("name");
        String merchant = id + "," + name;
        //设置导出选项
        //调用方法
        ResultActions resultActions2 = this.mockMvc2.perform(MockMvcRequestBuilders.post("/***/***.action").servletPath("/***/***.action").session(session).param("beginDate", beginDate.toString())
                .param("en**", endDate.toString()).param("mer**", merchant)
                .param("op**[]", "***", "***", "***", "***", "***", "***", "***", "***"));
        MvcResult mvcResult2 = resultActions2.andReturn();
        String result2 = mvcResult2.getResponse().getContentAsString();
        String resultExcel = new String(result2.getBytes("ISO-8859-1"), "UTF-8");
        System.out.println(resultExcel);
    }
}


这里使用的是MockMVC,其实我一开始还画蛇添足自定义了request,并设置值,后来发现MockMVC中应该内置了request,具体源码我还没看,等之后闲下来的时候再慢慢整理,(*^_^*)

private MockHttpServletRequest request;
private MockHttpServletResponse response;
request = new MockHttpServletRequest();
request.setCharacterEncoding("UTF-8");
request.setServletPath("/***/***.action");
response = new MockHttpServletResponse();

这里注意的是不要这样对session设置值

request.getSession().setAttribute(ConstantManager.SESSION_USER, JSON.toJSONString(userVo));


这里可以对session, servletPath等request属性进行设置值

 ResultActions resultActions2 = this.mockMvc2.perform(MockMvcRequestBuilders.post("/***/***.action").servletPath("/***/***.action").session(session).param("beginDate", beginDate.toString())
                .param("en**", endDate.toString()).param("mer**", merchant)
                .param("op**[]", "***", "***", "***", "***", "***", "***", "***", "***"));


设置数组参数的部分源码,只要往后加就行了。

public MockHttpServletRequestBuilder param(String name, String... values) {
		addToMultiValueMap(this.parameters, name, values);
		return this;
	}

好啦,就是这么多,更多的内容根据自己的需求自己探索,结果总是让人快乐的。O(∩_∩)O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值