用MockMvc对接口进行测试

为什么使用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为其注入。
无@AutoConfigureMockMvc报错图
测试请求

   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();
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值