mock测试spring boot的CRUD服务
controller如下:
-
@RestController
-
public class GithubController {
-
@Autowired
-
private GitHubRepository repository;
-
-
@Autowired
-
private GithubEntityManager manager;
-
-
/**
-
* attention:用户名可能存在多个
-
* Details:根据用户名查询数据库
-
* @author chhliu
-
*/
-
@RequestMapping(value="github/get/users/{username}", method=RequestMethod.GET)
-
public ResultMsg<List<GitHubEntity>> getGithubByUsername(@PathVariable("username") final String username){
-
ResultMsg<List<GitHubEntity>> res = new ResultMsg<List<GitHubEntity>>();
-
try {
-
Assert.hasLength(username, "username must be not null!");
-
List<GitHubEntity> list = repository.findEntityByUserName(username);
-
res.setResponseObject(list);
-
res.setOK(true);
-
} catch (Exception e) {
-
res.setErrorMsg(e.getMessage());
-
res.setOK(false);
-
}
-
return res;
-
}
-
-
/**
-
* attention:id唯一
-
* Details:根据id查询数据库
-
* @author chhliu
-
*/
-
@RequestMapping(value="github/get/user/{id}", method=RequestMethod.GET)
-
public ResultMsg<GitHubEntity> getGithubById(@PathVariable("id") final int id){
-
ResultMsg<GitHubEntity> msg = new ResultMsg<GitHubEntity>();
-
try {
-
boolean isExists = repository.exists(id);
-
if(isExists){
-
GitHubEntity en = repository.findOne(id);
-
msg.setResponseObject(en);
-
msg.setOK(true);
-
}else{
-
msg.setErrorMsg("the record id is not exist!");
-
msg.setOK(false);
-
}
-
} catch (Exception e) {
-
msg.setErrorMsg(e.getMessage());
-
msg.setOK(false);
-
}
-
return msg;
-
}
-
-
/**
-
* attention:
-
* Details:查询所有的结果,并分页和排序
-
* @author chhliu
-
*/
-
@RequestMapping(value="github/get/users/page", method=RequestMethod.GET)
-
public ResultMsg<Page<GitHubEntity>> findAllGithubEntity(final int pageOffset, final int pageSize, final String orderColumn){
-
ResultMsg<Page<GitHubEntity>> res = new ResultMsg<Page<GitHubEntity>>();
-
try {
-
res.setResponseObject(manager.findAllGithubEntity(pageOffset, pageSize, orderColumn));
-
res.setOK(true);
-
} catch (Exception e) {
-
res.setErrorMsg(e.getMessage());
-
res.setOK(false);
-
}
-
return res;
-
}
-
-
/**
-
* attention:
-
* Details:插入一个实体到数据库中
-
* @author chhliu
-
*/
-
@Modifying
-
@RequestMapping(value="github/post" ,method=RequestMethod.POST)
-
public ResultMsg<GitHubEntity> saveGithubEntity(@RequestBody final GitHubEntity entity){
-
ResultMsg<GitHubEntity> res = new ResultMsg<GitHubEntity>();
-
try {
-
Assert.notNull(entity, "the insert record must not be null!");
-
res.setResponseObject(repository.save(entity));
-
res.setOK(true);
-
} catch (Exception e) {
-
res.setErrorMsg(e.getMessage());
-
res.setOK(false);
-
}
-
return res;
-
}
-
-
/**
-
* attention:
-
* Details:更新一个实体类
-
* @author chhliu
-
*/
-
@Modifying
-
@RequestMapping(value="github/put", method=RequestMethod.PUT)
-
public ResultMsg<GitHubEntity> updateGithubEntity(final GitHubEntity entity){
-
ResultMsg<GitHubEntity> res = new ResultMsg<GitHubEntity>();
-
try {
-
Assert.notNull(entity, "the update record must not be null!");
-
Assert.notNull(entity.getId(), "the record id must not be null!");
-
boolean isExists = repository.exists(entity.getId());
-
if(isExists){
-
GitHubEntity en = repository.findOne(entity.getId());
-
if(null != en){
-
en.setCodeSnippet(entity.getCodeSnippet());
-
en.setCodeUrl(entity.getCodeUrl());
-
en.setProjectUrl(entity.getProjectUrl());
-
en.setSensitiveMessage(entity.getSensitiveMessage());
-
en.setSpriderSource(entity.getSpriderSource());
-
en.setSpriderUrl(entity.getSpriderUrl());
-
en.setUserName(entity.getUserName());
-
res.setResponseObject(repository.save(en));
-
res.setOK(true);
-
}else{
-
res.setOK(false);
-
res.setErrorMsg("doesn't find the record by id!");
-
}
-
}else{
-
res.setOK(false);
-
res.setErrorMsg("the record id is not exist!");
-
}
-
-
} catch (Exception e) {
-
res.setErrorMsg(e.getMessage());
-
res.setOK(false);
-
}
-
return res;
-
}
-
-
/**
-
* attention:
-
* Details:根据id删除一条数据
-
* @author chhliu
-
*/
-
@RequestMapping(value="github/delete/{id}", method=RequestMethod.DELETE)
-
public ResultMsg<Boolean> deleteGithubEntity(@PathVariable("id") final int id){
-
ResultMsg<Boolean> res = new ResultMsg<Boolean>();
-
try {
-
Assert.notNull(id);
-
boolean isExist = repository.exists(id);
-
if(isExist){
-
repository.delete(id);
-
res.setOK(true);
-
res.setResponseObject(true);
-
}else{
-
res.setOK(false);
-
res.setErrorMsg("the record id is not exist!");
-
}
-
} catch (Exception e) {
-
res.setErrorMsg(e.getMessage());
-
res.setOK(false);
-
}
-
return res;
-
}
-
}
测试代码如下:
-
@RunWith(SpringJUnit4ClassRunner.class)
-
@SpringBootTest(classes = CldpApplication.class)
-
@WebAppConfiguration
-
public class GitHubControllerTest {
-
@Autowired
-
private GithubController controller;
-
private MockMvc mvc;
-
@Before
-
public void setUp() throws Exception {
-
mvc = MockMvcBuilders.standaloneSetup(controller).build();
-
}
-
/**
-
* attention:
-
* Details:测试查询
-
* @author chhliu
-
* 创建时间:2016-12-7 下午3:41:34
-
* @throws Exception
-
* void
-
*/
-
@Test
-
public void getGitHubEntityByUsername() throws Exception {
-
MvcResult result = mvc.perform(
-
MockMvcRequestBuilders.get("/github/get/users/Datartisan")
-
.accept(MediaType.APPLICATION_JSON))
-
.andReturn();
-
int statusCode = result.getResponse().getStatus();
-
Assert.assertEquals(statusCode, 200);
-
String body = result.getResponse().getContentAsString();
-
System.out.println("body:"+body);
-
}
-
/**
-
* attention:
-
* Details:测试查询
-
* @author chhliu
-
* 创建时间:2016-12-7 下午3:41:49
-
* @throws Exception
-
* void
-
*/
-
@Test
-
public void getGitHubEntityById() throws Exception {
-
MvcResult result = mvc.perform(
-
MockMvcRequestBuilders.get("/github/get/user/721")
-
.accept(MediaType.APPLICATION_JSON))
-
.andReturn();
-
int statusCode = result.getResponse().getStatus();
-
Assert.assertEquals(statusCode, 200);
-
String body = result.getResponse().getContentAsString();
-
System.out.println("body:"+body);
-
}
-
/**
-
* attention:
-
* Details:测试分页查询
-
* @author chhliu
-
* 创建时间:2016-12-7 下午3:42:02
-
* @throws Exception
-
* void
-
*/
-
@Test
-
public void getGitHubEntityPage() throws Exception {
-
MvcResult result = mvc.perform(
-
MockMvcRequestBuilders.get("/github/get/users/page").param("pageOffset", "0")
-
.param("pageSize", "10").param("orderColumn", "id").accept(MediaType.APPLICATION_JSON))
-
.andReturn();
-
int statusCode = result.getResponse().getStatus();
-
Assert.assertEquals(statusCode, 200);
-
String body = result.getResponse().getContentAsString();
-
System.out.println("body:"+body);
-
}
-
/**
-
* attention:
-
* Details:测试插入,方式一,此方式需要controller中方法参数前没有@RequestBody
-
* @author chhliu
-
* 创建时间:2016-12-7 下午3:42:19
-
* @throws Exception
-
* void
-
*/
-
@Test
-
public void postGithubEntity() throws Exception{
-
RequestBuilder request = MockMvcRequestBuilders.post("/github/post")
-
.param("codeSnippet", "package")
-
.param("codeUrl", "http://localhost:8080/code")
-
.param("projectUrl", "http://localhost:8080")
-
.param("userName", "chhliu")
-
.param("sensitiveMessage", "love")
-
.param("spriderSource", "CSDN")
-
.contentType(MediaType.APPLICATION_JSON_UTF8);
-
MvcResult result = mvc.perform(request)
-
.andReturn();
-
int statusCode = result.getResponse().getStatus();
-
Assert.assertEquals(statusCode, 200);
-
String body = result.getResponse().getContentAsString();
-
System.out.println("body:"+body);
-
}
-
/**
-
* attention:
-
* Details:测试插入,方式二,此方式需要controller中方法参数前加@RequestBody
-
* @author chhliu
-
* 创建时间:2016-12-7 下午3:42:19
-
* @throws Exception
-
* void
-
*/
-
@Test
-
public void postGithubEntity1() throws Exception{
-
GitHubEntity entity = new GitHubEntity();
-
entity.setUserName("xyhg");
-
entity.setSpriderSource("ITeye");
-
entity.setCodeUrl("http://localhost:8080");
-
ObjectMapper mapper = new ObjectMapper();
-
MvcResult result = mvc.perform(MockMvcRequestBuilders.post("/github/post")
-
.contentType(MediaType.APPLICATION_JSON_UTF8)
-
.content(mapper.writeValueAsString(entity)))
-
.andExpect(MockMvcResultMatchers.status().isOk())
-
.andReturn();
-
int statusCode = result.getResponse().getStatus();
-
Assert.assertEquals(statusCode, 200);
-
String body = result.getResponse().getContentAsString();
-
System.out.println("body:"+body);
-
}
-
/**
-
* attention:
-
* Details:测试更新和插入类似
-
* @author chhliu
-
* 创建时间:2016-12-7 下午3:42:32
-
* @throws Exception
-
* void
-
*/
-
@Test
-
public void putGithubEntity() throws Exception{
-
RequestBuilder request = MockMvcRequestBuilders.put("/github/put")
-
.param("id", "719")
-
.param("codeSnippet", "import java.lang.exception")
-
.param("codeUrl", "http://localhost:8080/code")
-
.param("projectUrl", "http://localhost:8080")
-
.param("userName", "xyh")
-
.param("sensitiveMessage", "love")
-
.param("spriderSource", "CSDN");
-
MvcResult result = mvc.perform(request)
-
.andReturn();
-
int statusCode = result.getResponse().getStatus();
-
Assert.assertEquals(statusCode, 200);
-
String body = result.getResponse().getContentAsString();
-
System.out.println("body:"+body);
-
}
-
@Test
-
public void deleteGithubEntity() throws Exception{
-
RequestBuilder request = MockMvcRequestBuilders.delete("/github/delete/719");
-
MvcResult result = mvc.perform(request)
-
.andReturn();
-
int statusCode = result.getResponse().getStatus();
-
Assert.assertEquals(statusCode, 200);
-
String body = result.getResponse().getContentAsString();
-
System.out.println("body:"+body);
-
}
-
}
其中@SpringBootTest是@SpringApplicationConfiguration的替代注解,因为后者在spring boot1.4之后就被废弃了。
下面来看下这3个注解的作用
@RunWith:引入spring-test测试支持
@SpringBootTest:指定Spring boot工程的Application启动类
@WebAppConfiguration:Spring boot用来模拟ServletContext,并加载上下文
测试过程中,我们需要构建MockMvc,通过该类可以模拟发送,接收Restful请求
测试效果示例如下:
body:{"errorCode":null,"errorMsg":null,"responseObject":{"id":734,"createTime":1481103420245,"spriderSource":"ITeye","spriderUrl":null,"userName":"xyhg","projectUrl":null,"codeUrl":"http://localhost:8080","codeSnippet":null,"sensitiveMessage":null},"ok":true}
可以发现,测试通过了,并且返回结果和在浏览器中输入对应的url返回的结果是一致的!
推荐阅读
-
Spring Boot Security OAuth2 实现支持JWT令牌的授权服务器
-
spring boot2.0.4集成druid,用jmeter并发测试工具调用接口,druid查看监控的结果
-
Spring Boot Dubbo 构建分布式服务的方法
-
微服务架构盛行的时代,你需要了解点 Spring Boot
-
一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
-
基于Spring Boot 2.0.2.RELEASE 的 Spring Cloud 速成指南 | 二. Spring Cloud 服务注册中心(Eureka Server)
-
Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
-
Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
-
spring boot的应用程序单元测试方案
-
spring boot的应用程序单元测试方案