Ⅰ 如何在springMVC 中對REST服務使用mockmvc 做測試
spring 集成測試中 對mock 的集成實在是太棒了!但是使用請注意一下3個條件。
junit 必須使用4.9以上
同時您的框架必須是用spring mvc
spring 3.2以上才完美支持
目前使用spring MVC 取代struts2 的很多,spring MVC 的各種靈活讓人無比銷魂!所以使用spring MVC吧!
以前在對介面(主要是java服務端提供的介面(一般是:webService,restful))進行測試的中 一般用以下倆種方法。測試流程如圖:
這方法各種麻煩
2 使用Spring 提供的RestTemplate
錯誤不好跟蹤,必須開著伺服器
使用mockMVC都不是問題了看使用實例:
使用事例如下:父類
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.test.context.ContextConfiguration;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
importorg.springframework.test.context.web.WebAppConfiguration;
importorg.springframework.web.context.WebApplicationContext;
@WebAppConfiguration
@ContextConfiguration(locations={"classpath:applicationContext.xml",
"classpath:xxxx-servlet.xml"})
{
@Autowired
;
}
子類:
importorg.junit.Before;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
importorg.springframework.test.web.servlet.MockMvc;
importorg.springframework.test.web.servlet.setup.MockMvcBuilders;
importcom.conlect.oatos.dto.status.RESTurl;
importcom.qycloud.oatos.server.service.PersonalDiskService;
//這個必須使用junit4.9以上才有。
@RunWith(SpringJUnit4ClassRunner.class)
{
privatestaticStringURI=RESTurl.searchPersonalFile;
privateMockMvcmockMvc;
privateStringjson="{"entId":1234,"userId":1235,"key":"new"}";
@Autowired
;
@Before
publicvoidsetup(){
//this.mockMvc=webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
this.mockMvc=MockMvcBuilders.standaloneSetup(personalDiskService).build();
}
@Test
publicvoidreadJson()throwsException{
this.mockMvc.perform(
post(URI,"json").characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON)
.content(json.getBytes()))
.andExpect(content().string("ReadfromJSON:JavaBean{foo=[bar],fruit=[apple]}")
);
}
上面是簡單的例子,實際使用起來可以稍做修改。記得導入spring -test jar 包。無需額外配置(是不是很方便!)
當然和junit 的assert 一起用的話效果更好。下面貼點例子。就能跑。
Java代碼
packagecom.qycloud.oatos.server.test.mockmvcTest;
importstaticorg.junit.Assert.fail;
importstaticorg.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
importjava.io.UnsupportedEncodingException;
importjava.lang.reflect.Field;
importorg.springframework.test.web.servlet.MockMvc;
importcom.conlect.oatos.dto.status.CommConstants;
importcom.conlect.oatos.dto.status.ErrorType;
publicclassMockUtil{
/**
*mock
*
*@paramuri
*@paramjson
*@return
*@
*@throwsException
*/
publicstaticStringmock(MockMvcmvc,Stringuri,Stringjson)
,Exception{
returnmvc
.perform(
post(uri,"json").characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON)
.content(json.getBytes())).andReturn()
.getResponse().getContentAsString();
}
/**
*
*@paramre返回值
*@paramobject要轉換的對象
*@paramtestName當前測試的對象
*/
publicstatic<T>voidcheck(Stringre,Class<T>object,StringtestName){
System.out.println(re);
if(ErrorType.error500.toString().equals(re)){
System.out.println("-----該介面測試失敗:-----"
+testName);
fail(re);
}elseif(CommConstants.OK_MARK.toString().equals(re)){
System.out.println("-----該介面測試成功:-----"
+testName);
}else{
System.out.println("-----re-----:"+re);
}
if(object!=null){
if(re.contains(":")){
try{
Tt=PojoMapper.fromJsonAsObject(re,object);
System.out.println("-----該介面測試成功:-----"
+testName);
}catch(Exceptione){
System.out.println("-----該介面測試失敗:-----"
+testName);
fail(e.getMessage());
}
}
}
}
/**
*初始化版本信息。每次調用測試用力之前首先更新版本信息
*@parammockMvc
*@paramurl
*@paramfileId
*@paramclass1
*@return
*@
*@throwsException
*/
publicstatic<T>LongupdateVersion(MockMvcmockMvc,Stringurl,
LongfileId,Class<T>class1),Exception{
Stringre=mock(mockMvc,url,fileId+"");
Tdto=PojoMapper.fromJsonAsObject(re,class1);
Longversion=Long.parseLong(dto.getClass().getMethod("getVersion").invoke(dto).toString());
System.out.println("version="+version);
returnversion;
}
}
使用如下:
Java代碼
@RunWith(SpringJUnit4ClassRunner.class)
{
privateMockMvcmockMvc;
privatestaticLongentId=1234L;
privatestaticLongadminId=1235L;
@Autowired
;
@Before
publicvoidsetup(){
this.mockMvc=MockMvcBuilders.standaloneSetup(personalDiskService)
.build();
}
/***
*pass
*全局搜索企業文件
*
*@throwsException
*/
@Test
publicvoidsearchPersonalFile()throwsException{
SearchFileParamDTOsf=newSearchFileParamDTO();
sf.setEntId(entId);
sf.setKey("li");
sf.setUserId(adminId);
Stringjson=PojoMapper.toJson(sf);
Stringre=MockUtil.mock(this.mockMvc,RESTurl.searchPersonalFile,
json);
MockUtil.check(re,SearchPersonalFilesDTO.class,"searchPersonalFile");
}
}
當然@setup裡面是每個@test執行時都會執行一次的,所以有些需要每次都實例化的參數可以放進來
如下:
Java代碼
@Autowired
;
@Before
publicvoidsetup(){
this.mockMvc=MockMvcBuilders.standaloneSetup(shareDiskService)
.build();
try{
initDatas();
}catch(Exceptione){
e.printStackTrace();
}
}
privatevoidinitDatas(),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);
}
ok!基本使用大致如此,代碼沒有些注釋,但是很簡單,看懂是沒問題的。權當拋磚引玉。希望大家加以指正!