单元测试
测试对任何项目来说是必不可少的
测试Service中的findOne方法
第一种方式,可以自己去test目录下写测试类
package cn.chenhaoxiang; import cn.chenhaoxiang.entity.People; import cn.chenhaoxiang.service.PeopleService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 3:52. * Explain: */ @RunWith(SpringRunner.class)//表示在测试环境中跑 @SpringBootTest//表示将启动整个spring 的工程 public class PeopleServiceTest { @Autowired private PeopleService peopleService; @Test public void findOneTest(){ People people = peopleService.findOne(7); //使用断言 Assert.assertEquals(new Integer(20),people.getAge()); } }
第二种方式,如果你是使用的IDEA这个工具,可以直接这样
PeopleService接口的findOne方法上右键,出现如下的
选择go to,然后点击test
因为我已经用方式一创建了一个测试方法,没事,可以再创建一个演示一下
选择需要测试的方法
也就是勾上你需要测试的方法
点击ok,会给你在test目录下创建如下的类
package cn.chenhaoxiang.service; import org.junit.Test; import static org.junit.Assert.*; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 4:04. * Explain: */ public class PeopleServiceTest { @Test public void findOne() throws Exception { } }
然后你进行添加类注解
@RunWith(SpringRunner.class)//表示在测试环境中跑 @SpringBootTest//表示将启动整个spring 的工程
和注入接口
@Autowired private PeopleService peopleService;
其他的就类似方式一了,只是相对于方式一,少写了一点代码,对应的包,类,方法名都给你建好了。
对Controller测试
我们对controller的获取所有人的方法进行测试,也就是测试
/** * 获取所有的人的数据 * @return */ @GetMapping(value = "/peoples") public List<People> getPeople(){ logger.info("getPeople"); return peopleDao.findAll();//一句SQL都没写,很方便 }
我们在IDEA中使用方式二,右键go to的方式进行
首先我们相对与之前的service测试需要多加一个@AutoConfigureMockMvc注解
package cn.chenhaoxiang.controller; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import static org.junit.Assert.*; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 4:09. * Explain: */ @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc //Controller测试的,需要是用这个注解 public class IndexControllerTest { // @Autowired // private IndexController indexController; // @Test // public void getPeople1() throws Exception { // indexController.getPeople();//这样只是对方法进行了测试 // //我们想用url进行测试,而且可以进行post或者get方法 // } @Autowired private MockMvc mvc; @Test public void getPeople() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/peoples"))//如果是post,就是调用post方法 .andExpect(MockMvcResultMatchers.status().isOk());//对返回的状态码进行判断 // .andExpect(MockMvcResultMatchers.content().string("a"))//对返回值进行判断,这里是200 } //当进行打包的时候,会运行所有的单元测试方法,如果有失败,就会出现打包失败 //如果打包的时候希望跳过单元测试,则打包命令为 // mvn clean package -Damven.test.skip=true }
可以在测试输出中看到结果的
然后测试一下post请求,并带参数的
/** * post测试,并带参数 * @throws Exception */ @Test public void peopleEdit() throws Exception { //发送请求 ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post("/edit").param("id","6") .param("name","测试Controller") .param("score","20.00") .param("age","29"))//如果是post,就是调用post方法 .andExpect(MockMvcResultMatchers.status().isOk());//对返回的状态码进行判断 MvcResult mvcResult = resultActions.andReturn(); String result = mvcResult.getResponse().getContentAsString(); System.out.println("客户端获得反馈数据:" + result); }
传递的是People参数,在这里我们传参不要直接传People对象或者该对象的json,应该对每个属性都用param赋值传
完整的Controller测试类
package cn.chenhaoxiang.controller; import cn.chenhaoxiang.entity.People; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; 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.result.MockMvcResultMatchers; import static org.junit.Assert.*; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 4:09. * Explain: */ @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc //Controller测试的,需要是用这个注解 public class IndexControllerTest { // @Autowired // private IndexController indexController; // @Test // public void getPeople1() throws Exception { // indexController.getPeople();//这样只是对方法进行了测试 // //我们想用url进行测试,而且可以进行post或者get方法 // } @Autowired private MockMvc mvc; @Test public void getPeople() throws Exception { ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get("/peoples"))//如果是post,就是调用post方法 .andExpect(MockMvcResultMatchers.status().isOk());//对返回的状态码进行判断,这个isOK是200 // .andExpect(MockMvcResultMatchers.content().string("a"))//对返回值进行判断 MvcResult mvcResult = resultActions.andReturn(); String result = mvcResult.getResponse().getContentAsString(); System.out.println("客户端获得反馈数据:" + result); } //当进行打包的时候,会运行所有的单元测试方法,如果有失败,就会出现打包失败 //如果打包的时候希望跳过单元测试,则打包命令为 // mvn clean package -Damven.test.skip=true /** * post测试,并带参数 * @throws Exception */ @Test public void peopleEdit() throws Exception { //发送请求 ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post("/edit").param("id","6") .param("name","测试Controller") .param("score","20.00") .param("age","29"))//如果是post,就是调用post方法 .andExpect(MockMvcResultMatchers.status().isOk());//对返回的状态码进行判断 MvcResult mvcResult = resultActions.andReturn(); String result = mvcResult.getResponse().getContentAsString(); System.out.println("客户端获得反馈数据:" + result); } }
源代码下载地址:
GITHUB源码下载地址: 【点我进行下载】