鹏仔先生-趣站-一个有趣的网站!
鹏仔先生

鹏仔先生

当前位置:网站首页 > 美食推荐 > 正文

如何在springMVC 中对REST服务使用mockmvc 做测试

作者:百变鹏仔日期:2023-12-12 07:48:44浏览:22分类:美食推荐

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都不是问题了看使用实例:

使用事例如下:父类

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;

如何在springMVC 中对REST服务使用mockmvc 做测试

@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.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就能跑。

Java代码

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.test.web.servlet.MockMvc;

import?com.conlect.oatos.dto.status.CommConstants;

import?com.conlect.oatos.dto.status.ErrorType;

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??void?check(String?re,?Class?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??Long?updateVersion(MockMvc?mockMvc,?String?url,

Long?fileId,?Class?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;

}

}

使用如下:

Java代码

@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");

}

当然@setup里面是每个@test执行时都会执行一次的,所以有些需要每次都实例化的参数可以放进来

如下:

Java代码

@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);

}

ok!基本使用大致如此,代码没有些注释,但是很简单,看懂是没问题的。权当抛砖引玉。希望大家加以指正!鹏仔 微信 15129739599

百科狗 baikegou.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

  • 上一篇:已经是第一篇了
  • 下一篇:已经是最后一篇了
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)