springboot接口测试
前言
在springboot中测试接口,我们可以采用postman进行测试,但还有其他方式,比如junit测试,在test包中测试接口
本章分为三节,分别讲在test包下的三种接口测试方式
- Service测试
- Controller测试
- TestRestTemplate测试
Service测试
我建了一个service,里面有两个方法
- 分别是获取姓名(getName),姓名作为请求参数,然后字符串拼接姓名返回出去
- 另一个是获取一个对象,对象作为请求参数传入并返回
然后在测试包下面建立一个测试类,并在类上面加上两个类注解:@SpringBootTest,@RunWith(SpringRunner.class)
首先注入service,然后注入的对象就可以调用方法了
写一个测试方法,测试方法上加:@Test 注解,然后点击方法前面的绿色标记就可以启动方法进行结果测试,我这里用了断言来测试响应结果验证,验证结果是否等于我预期的值
Assert.assertThat(name, Matchers.is(“姓名:三国演义”));
第一个参数:name是响应结果,第二个参数:Matchers.is(“姓名:三国演义”))是预期结果值
绿色代表接口测试正确,响应结果和预期结果一致
Controller测试
controller测试有点复杂,不像service直接注入对象就行了。这里我用mockMvc来测试controler接口,建一个 HelloController 类
类中有两个方法,一个get方法,一个post方法。
然后写测试类型,controller测试类和service测试类一样,加两个类注解,然后写一个类启动之前的方法,生成 MockMvc 的实例,方法上一定要加 :@Before 注解,不然测试接口会报错
然后我们来测试get方法
用mockMvc发起请求get请求
方法解析:
-
perform:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
-
get:声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object… urlVariables):根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
-
param:添加request的参数,如上面发送请求的时候带上了了pcode = root的参数。假如使用需要发送json数据格式的时将不能使用这种方式,可见后面被@ResponseBody注解参数的解决方法
-
andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断);
-
andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判-断);
-
andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);
然后控制台打印结果值System.out.println(mvcResult.getResponse().getStatus() + " -- "+mvcResult.getResponse().getContentAsString());
status是响应code码,200代表成功,其他表示失败,根据编码查看失败原因
contentAsString是把响应body转成string格式
红色的值,是控制台打印出的值。蓝色部分是andDo(MockMvcResultHandlers.print())
打印的报文,包含请求url,类型,参数,请求头,响应状态码,响应头,响应body等信息
然后我们看post请求,发送json参数
唯一变化的地方就是,请求类型变为post,请求参数设置是content方法
TestRestTemplate测试
相信看完mock方式测试之后,觉得有点复杂。这里有一个简单的方式,那就是TestRestTemplate,通过TestRestTemplate来调用接口,使用方式和spring中的RestTemplate一致
通过源码,我们可以看到 TestRestTemplate 底层就是用的 RestTemplate
首先建一个test包下建一个测试类
使用TestRestTemplate进行接口测试,上面的@SpringBootTest注解需要进行更改,更改之后,直接通过@Autowired注入TestRestTemplate
在测试方法中,直接使用TestRestTemplate实例发起请求
getForObject代表发起get请求
第一位参数是url
第二位参数是响应数据的类型
第三位参数是请求参数的值
postForObjesc代表发起post请求
第一位参数是url
第二位参数是请求参数
第三位参数是响应类型
怎么样,是不是比Mock测试简单很多。唯一的难点就是 TestRestTemplate 的使用方法,我推荐你看下「 江南一点雨」的博客
「松哥」的博客写的很清晰
丶clearwater