博客分类:
spring 集成测试中对mock 的集成实在是太棒了!但是使用请注意一下3个条件。
- junit 必须使用4.9以上
- 同时您的框架必须是用spring mvc
- spring 3.2以上才完美支持
目前使用spring MVC 取代struts2 的很多,spring MVC 的各种灵活让人无比销魂!所以使用spring MVC吧!
以前在对接口(主要是java服务端提供的接口(一般是:webService,restful))进行测试的中一般用以下俩种方法。测试流程如图:
1 直接使用httpClient
这方法各种麻烦
2 使用Spring 提供的RestTemplate
错误不好跟踪,必须开着服务器
3 使用mockMVC都不是问题了看使用实例:
使用事例如下:父类
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import org.springframework.test.context.web.WebAppConfiguration;
- import org.springframework.web.context.WebApplicationContext;
- @WebAppConfiguration
- @ContextConfiguration (locations = { "classpath:applicationContext.xml" ,
- "classpath:xxxx-servlet.xml" })
- public class AbstractContextControllerTests {
- @Autowired
- protected WebApplicationContext wac;
- }
- 子类:
- import org.junit.Before;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.MediaType;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import org.springframework.test.web.servlet.MockMvc;
- import org.springframework.test.web.servlet.setup.MockMvcBuilders;
- import com.conlect.oatos.dto.status.RESTurl;
- import com.qycloud.oatos.server.service.PersonalDiskService;
- //这个必须使用junit4.9以上才有。
- @RunWith (SpringJUnit4ClassRunner. class )
- public class PersonalDiskMockTests extends AbstractContextControllerTests {
- private static String URI = RESTurl.searchPersonalFile;
- private MockMvc mockMvc;
- private String json = "{\"entId\":1234,\"userId\":1235,\"key\":\"new\"}" ;
- @Autowired
- private PersonalDiskService personalDiskService;
- @Before
- public void setup() {
- //this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
- this .mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService).build();
- }
- @Test
- public void readJson() throws Exception {
- this .mockMvc.perform(
- post(URI, "json" ).characterEncoding( "UTF-8" )
- .contentType(MediaType.APPLICATION_JSON)
- .content(json.getBytes()))
- .andExpect(content().string( "Read from JSON: JavaBean {foo=[bar], fruit=[apple]}" )
- );
- }
上面是简单的例子,实际使用起来可以稍做修改。记得导入spring -test jar 包。 无需额外配置(是不是很方便!)
当然和junit 的assert 一起用的话效果更好。下面贴点例子。copy就能跑。
- package com.qycloud.oatos.server.test.mockmvcTest;
- import static org.junit.Assert.fail;
- import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
- import java.io.UnsupportedEncodingException;
- import java.lang.reflect.Field;
- import org.springframework.http.MediaType;
- import org.springframework.test.web.servlet.MockMvc;
- import com.conlect.oatos.dto.status.CommConstants;
- import com.conlect.oatos.dto.status.ErrorType;
- import com.conlect.oatos.http.PojoMapper;
- public class MockUtil {
- /**
- * mock
- *
- * @param uri
- * @param json
- * @return
- * @throws UnsupportedEncodingException
- * @throws Exception
- */
- public static String mock(MockMvc mvc, String uri, String json)
- throws UnsupportedEncodingException, Exception {
- return mvc
- .perform(
- post(uri, "json" ).characterEncoding( "UTF-8" )
- .contentType(MediaType.APPLICATION_JSON)
- .content(json.getBytes())).andReturn()
- .getResponse().getContentAsString();
- }
- /**
- *
- * @param re 返回值
- * @param object 要转换的对象
- * @param testName 当前测试的对象
- */
- public static <T> void check(String re, Class<T> object,String testName) {
- System.out.println(re);
- if (ErrorType.error500.toString().equals(re)) {
- System.out.println( "-----该接口测试失败:-----"
- + testName);
- fail(re);
- } else if (CommConstants.OK_MARK.toString().equals(re)) {
- System.out.println( "-----该接口测试成功:-----"
- + testName);
- } else {
- System.out.println( "-----re----- :" +re);
- }
- if (object != null ) {
- if (re.contains( ":" )) {
- try {
- T t = PojoMapper.fromJsonAsObject(re, object);
- System.out.println( "-----该接口测试成功:-----"
- + testName);
- } catch (Exception e) {
- System.out.println( "-----该接口测试失败:-----"
- + testName);
- fail(e.getMessage());
- }
- }
- }
- }
- /**
- * 初始化版本信息。每次调用测试用力之前首先更新版本信息
- * @param mockMvc
- * @param url
- * @param fileId
- * @param class1
- * @return
- * @throws UnsupportedEncodingException
- * @throws Exception
- */
- public static <T> Long updateVersion(MockMvc mockMvc, String url,
- Long fileId, Class<T> class1) throws UnsupportedEncodingException, Exception {
- String re = mock(mockMvc, url, fileId+ "" );
- T dto = PojoMapper.fromJsonAsObject(re, class1);
- Long version = Long.parseLong(dto.getClass().getMethod( "getVersion" ).invoke(dto).toString());
- System.out.println( "version = " +version);
- return version;
- }
- }
- @RunWith (SpringJUnit4ClassRunner. class )
- public class PersonalDiskMockTests extends AbstractContextControllerTests {
- private MockMvc mockMvc;
- private static Long entId = 1234L;
- private static Long adminId = 1235L;
- @Autowired
- private PersonalDiskService personalDiskService;
- @Before
- public void setup() {
- this .mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService)
- .build();
- }
- /***
- * pass
- * 全局搜索企业文件
- *
- * @throws Exception
- */
- @Test
- public void searchPersonalFile() throws Exception {
- SearchFileParamDTO sf = new SearchFileParamDTO();
- sf.setEntId(entId);
- sf.setKey( "li" );
- sf.setUserId(adminId);
- String json = PojoMapper.toJson(sf);
- String re = MockUtil.mock( this .mockMvc, RESTurl.searchPersonalFile,
- json);
- MockUtil.check(re, SearchPersonalFilesDTO. class , "searchPersonalFile" );
- }
- }
如下:
- @Autowired
- private ShareDiskService shareDiskService;
- @Before
- public void setup() {
- this .mockMvc = MockMvcBuilders.standaloneSetup(shareDiskService)
- .build();
- try {
- initDatas();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void initDatas() throws UnsupportedEncodingException, Exception {
- FileIdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,FileId,ShareFileDTO. class );
- File2IdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,File2Id,ShareFileDTO. class );
- oldPicFolderVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFolderById,oldPicFolderId,ShareFolderDTO. class );
- }
- 以上是我摘抄别人的,以下是我在公司用的写法
测试类:
-
package cn.com.mcd;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import cn.com.mcd.common.ResultModel;
import cn.com.mcd.controller.StoreLocalPmController;import cn.com.mcd.model.StoreLocalPm;@RunWith(SpringJUnit4ClassRunner.class)
public class TestStoreLocalPm extends BaseControllerTest{ //@Resource //private StoreLocalPmService storeLocalPmService; @Autowired private StoreLocalPmController storeLocalPmController; private MockMvc mockMvc; @Before public void setup() { //this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build(); this.mockMvc = MockMvcBuilders.standaloneSetup(storeLocalPmController).build(); } /** * 根据条件查询列表 */ //@Test public void selectStoreLocalPmList() { StoreLocalPm storeLocalPm=new StoreLocalPm(); Long id=1L; storeLocalPm.setId(id);//餐厅编号 storeLocalPm.setStoreName("");//餐厅名称 storeLocalPm.setAuditStatus("");//审核状态 ResultModel resultModel=storeLocalPmController.selectStoreLocalPmList(null,storeLocalPm); System.out.print("test.resultModel="+resultModel.getResultCode()+"\n"+resultModel.getResultMsg()+"\n"+resultModel.getResultData()); } /** * 根据id查询详情 * @throws Exception */ @Test public void selectByPrimaryKey() throws Exception { String url = "/storeLocalPm/selectByPrimaryKey"; StoreLocalPm storeLocalPm =new StoreLocalPm(); storeLocalPm.setId(1L); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(storeLocalPm); MvcResult result = (MvcResult) mockMvc.perform(post(url) .contentType(MediaType.APPLICATION_JSON) .content(json) .param("epsToken", "token") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(MockMvcResultHandlers.print()) .andReturn(); System.out.println("----------"+result.getResponse().getStatus()); System.out.println("----------"+result.getResponse().getContentAsString()); //Assert.assertEquals(200, result.getResponse().getStatus()); //Assert.assertNotNull(result.getResponse().getContentAsString()); //Long id=1L; //ResultModel resultModel=storeLocalPmController.selectByPrimaryKey(id); //System.out.print("test.resultModel="+resultModel.getResultCode()+"\n"+ //resultModel.getResultMsg()+"\n"+resultModel.getResultData()); }}- cotroller
-
package cn.com.mcd.controller;
import java.util.List;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import cn.com.mcd.common.ResultModel;
import cn.com.mcd.model.KitchenEquipmentPrice;import cn.com.mcd.model.StoreLocalPm;import cn.com.mcd.service.StoreLocalPmService;import cn.com.mcd.util.Constants;import cn.com.mcd.util.PagesPojo;@Controller
@RequestMapping("/storeLocalPm")public class StoreLocalPmController { private static final long serialVersionUID = 4515788554984036250L; private static final Logger log = LoggerFactory.getLogger(StoreLocalPmController.class); @Resource private StoreLocalPmService storeLocalPmService; /** * query detail by id * @param id * @return */ @RequestMapping(value = "/selectByPrimaryKey", method = RequestMethod.POST) @ResponseBody public ResultModel selectByPrimaryKey(@RequestBody StoreLocalPm storeLocalPm) { log.info(this.getClass().getName()+".selectByPrimaryKey.start.storeLocalPm="+storeLocalPm); ResultModel resultModel = new ResultModel(); try{ storeLocalPm=storeLocalPmService.selectByPrimaryKey(storeLocalPm.getId()); log.info(this.getClass().getName()+".selectByPrimaryKey.success.storeLocalPm="+storeLocalPm); resultModel.setResultCode(Constants.SERVICE_SUCCESS_CODE); resultModel.setResultMsg(Constants.DATA_BASE_SEARCH_SUCCESS_MSG); resultModel.setResultData(storeLocalPm); }catch(Exception e){ resultModel.setResultCode(Constants.SERVICE_ERROR_CODE); resultModel.setResultMsg(Constants.DATA_BASE_SEARCH_ERROR_MSG); } log.info(this.getClass().getName()+".selectByPrimaryKey.end.resultModel="+resultModel); return resultModel; } /** * query list by param * @param id * @return */ @RequestMapping(value = "/selectStoreLocalPmList", method = RequestMethod.GET) @ResponseBody public ResultModel selectStoreLocalPmList(@ModelAttribute PagesPojo<StoreLocalPm> page,StoreLocalPm storeLocalPm) { log.info(this.getClass().getName()+".selectStoreLocalPmList.start.page="+page); ResultModel result = new ResultModel(); try{ int count = storeLocalPmService.countAll(storeLocalPm); page.setTotalRow(count); List<StoreLocalPm> list = storeLocalPmService.selectStoreLocalPmList(page); page.setPages(list); result.setResultCode(Constants.SERVICE_SUCCESS_CODE); result.setResultMsg(Constants.DATA_BASE_SEARCH_SUCCESS_MSG); result.setResultData(page); }catch(Exception e){ result.setResultCode(Constants.SERVICE_ERROR_CODE); result.setResultMsg(Constants.DATA_BASE_SEARCH_ERROR_MSG); } log.info(this.getClass().getName()+".selectStoreLocalPmList.end.result="+result); return result; } int deleteByPrimaryKey(Long id){ return 0; }int insert(StoreLocalPm record) {
return 0; }int insertSelective(StoreLocalPm record){
return 0; } int updateByPrimaryKeySelective(StoreLocalPm record) { return 0; }int updateByPrimaryKey(StoreLocalPm record) {
return 0; }}