您的位置:首页 > 编程语言 > Java开发

关于Spring中Controller的单元测试

2017-08-30 14:33 204 查看
第一次写对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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: