内容简介:在我们当前的项目中我们的在请求微信获取微信企业号的时候调用微信的接口,当我们在测试的时候,我们所测试的方法所使用的接口也是真实的接口,这是不正确的,因为我们的测试目的是测试一下我们的所写的代码是否正确,但当我们的代码依赖于其他组织的网络配置时,当其他组织的接口出现问题之后,我们的测试就会报错,所以为了我们的测试不依赖于外部的接口,我们要在测试的时候模拟接口返回数据。使用通过代码来简单的介绍一下如何使用
问题描述:
在我们当前的项目中我们的在请求微信获取微信企业号的时候调用微信的接口,当我们在测试的时候,我们所测试的方法所使用的接口也是真实的接口,这是不正确的,因为我们的测试目的是测试一下我们的所写的代码是否正确,但当我们的代码依赖于其他组织的网络配置时,当其他组织的接口出现问题之后,我们的测试就会报错,所以为了我们的测试不依赖于外部的接口,我们要在测试的时候模拟接口返回数据。
解决方案
使用 MockRestServiceServer
类来解决,根据官方文档描述,该类主要用于设计直接或间接使用 RestTemplate
的测试,通过设置 RestTemplate
的预期请求,来模拟发送回来的响应,来消除对实际请求的依赖。
通过代码来简单的介绍一下如何使用
要测试的代码如下,使用 RestTemplate
来请求第三方的api。
@Autowired private RestTemplate restTemplate; .... public void synchronizeData() { ..... logger.debug("调用接口,获取所有的教师"); JSONObject jsonObject = restTemplate.getForEntity(url + "...").getBody(); ..... } .....
测试代码如下:
先将 restTemplate
设置成 MockRestServiceServer
,然后使用MockRestServiceServer来设置预期请求,和模拟返回,然后我们测试的请求就会按我们模拟的数据进行响应。
MockRestServiceServer mockRestServiceServer = MockRestServiceServer.createServer(restTemplate); mockRestServiceServer.expect( ExpectedCount.once(), MockRestRequestMatchers.requestTo(new URI(accessTokenUrl))) .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) .contentType(MediaType.APPLICATION_JSON_UTF8) .body(jsonObjectTocken.toJSONString())); teacherService.synchronizeData();
官方实例如下:
RestTemplate restTemplate = new RestTemplate() MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build(); server.expect(manyTimes(), requestTo("/hotels/42")).andExpect(method(HttpMethod.GET)) .andRespond(withSuccess("{ \"id\" : \"42\", \"name\" : \"Holiday Inn\"}", MediaType.APPLICATION_JSON)); Hotel hotel = restTemplate.getForObject("/hotels/{id}", Hotel.class, 42); // Use the hotel instance... // Verify all expectations met server.verify();
方法介绍:
bindTo(RestTemplate restTemplate).build()
返回一个用于回复指定 RestTemplate
的生成器。
createServer(RestTemplate restTemplate)
bindTo().build()
的快捷生成方式。
expect(ExpectedCount count, RequestMatcher matcher)
按 RequestMatcher
设置指定次数请求。
expect(RequestMatcher matcher)
完成单次 http
请求。
总结:
在写的时候错误的使用如下实现方式:
@GetMapping("/students/{studentId}/courses") public List<Course> retrieveCoursesForStudent(@PathVariable String studentId) { return studentService.retrieveCourses(studentId); } Mockito.when( studentService.retrieveCourse(Mockito.anyString(), Mockito.anyString())).thenReturn(mockCourse); RequestBuilder requestBuilder = MockMvcRequestBuilders.get( "/students/Student1/courses/Course1").accept( MediaType.APPLICATION_JSON); MvcResult result = mockMvc.perform(requestBuilder).andReturn();
导致这么写怎么改都不理想,到后来请教喜硕,发现喜硕快速的通过google找到了正确的解决方案的相关代码,反思自己还是能力有欠缺不能思考到问题的关键点,而且使用英文goole的能力还有待提高。
参考:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 手机APP客户端安全性测试相关
- Android移动客户端性能测试浅谈——电量
- 如何生成测试用kafka服务端和客户端证书
- 渗透测试及漏洞挖掘技巧干货分享——客户端JavaScript静态分析
- 通过命令行在Python中测试以太坊RPC客户端
- V神:以太坊2.0团队或在4月推出多客户端测试网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。