为什么使用Mockmvc?
(业务角度)
在基于springboot开发接口的过程中,测试时必不可少的,起初我们开发人员常用的测试工具是:postman、Swagger
在我们公司一般使用的是Swagger测试,通过构造param参数,请求头传参等,请求目标接口获取返回的content,一般都是肉眼去查看之后确认接口是否调通。从我们leader的角度来讲,这并不能成为一个测试通过的标志,使用Mockmvc,以及断言代码去判断通过(2次断言判断),只有真真实实的看到了判断,通过了判断才能算是我们接口测试成功了。
(技术了解角度)
对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了可以对Controller进行测试,我们引入了MockMVC。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
上述摘自https://blog.csdn.net/zai_xia/article/details/83419104
主要是忽略网络对测试带来的一些问题,更专注与接口本身;测试也更为便捷。
1) 一个方法一个接口,一一对应,有据可循
2)代码判断,确保通过的合理
开始使用MockMvc
首先是添加的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
然后创建测试类,并为类添加注解
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {xxx.class})
@AutoConfigureMockMvc
xxx.class为你的启动类
@AutoConfigureMockMvc注解会在下面说
然后就是创建MockMvc之后用于测试
@Autowired
private MockMvc mockMvc;//这里我们使用了自动装配
自动装配都能理解,但是这个MockMvc的自动装配是一定要配合@AutoConfigureMockMvc这个注解的
如果没有配合使用那么就会报错,无法找到适配的bean为其注入。
测试请求
MvcResult result = mockMvc
. perform(post("/company/api/pc/v1/test") //请求的方式 请求路径
.contentType("application/json") //请求的形式
.content("{type:1,platform:1}") //参数(使用的是content) 同样也可以使用.param(key,value)方法去设置
.headers(httpHeaders)) //设置请求头
.andExpect(status().isOk()) //确保成功的判断
.andReturn();//返回
String content=result.getResponse().getContentAsString();//返回体
然后上述代码中用到了httpHeaders 这是个org.springframework.http.HttpHeaders的类
用于设置请求头
ex:
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("test1","1");
httpHeaders.add("test2","2");
httpHeaders.add("test3","3");
httpHeaders.add("test4","4");
其实mockMvc.header(Key,Value)可以单独设置,但大多数放在请求头里的都是验证信息,重复的也是cv一下,不如就抽象一下,看着舒服。
上述例子只是其中的一种,mockMvc还有很多可以用于测试的方法和参数属性类型,这就不一一展开了。这主要也只是我在开发过程中,吃成长快乐的一个过程,必要需要用到再具体使用相应的方法。
还没结束
这里只是我们的请求可以单独的运行,debug了还不能算成功,因为测试的目的是得到明确的成功或失败。、
断言(Assert)的引入
需要导入
import org.junit.Assert;
断言字面意思上就是判断一句话
Assert.assertTrue(content.length()>0);//里面是一个Boolean 判断
然后我去了解了一下这个Assert
小写的assert在jdk1.4的时候被引入成为了一个关键字
用法
assert(1>0)//也同样是判断
而Assert是一个提供的更多用于测试的一个对象,还可以比较数组,字符串等的相等,以及为空,功能挺多的看着就舒服。
虽然现在用的idea但是assert(小写)关键字在Eclipse(3.0M9)开发环境中,运行时,我们必须配置运行时的选项"Run",在Arguments页面中的"VM Arguments" 中填入-ea选项。才能让断言在运行时起作用。
这个是我百度来的,当然里面有一句话很关键:
断言最重要的一点是必须不依赖它们完成任何程序实际所需的行为。
断言只在程序运行时有效,断言为true则继续运行,false则抛出异常。仅用于测试!!!
后续
在之后写TestCase的时候mockmvc报了空指针
解决方案
/**
* 所有测试方法执行之前执行该方法
*/
@Before
public void before() {
//获取mockmvc对象实例
mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}