关于Spring中Controller的单元测试

来源:互联网 发布:手机淘宝怎么上传宝贝 编辑:程序博客网 时间:2024/06/07 16:03

第一次写对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

阅读全文
0 0