内容简介:在我们当前的项目中我们的在请求微信获取微信企业号的时候调用微信的接口,当我们在测试的时候,我们所测试的方法所使用的接口也是真实的接口,这是不正确的,因为我们的测试目的是测试一下我们的所写的代码是否正确,但当我们的代码依赖于其他组织的网络配置时,当其他组织的接口出现问题之后,我们的测试就会报错,所以为了我们的测试不依赖于外部的接口,我们要在测试的时候模拟接口返回数据。使用通过代码来简单的介绍一下如何使用
问题描述:
在我们当前的项目中我们的在请求微信获取微信企业号的时候调用微信的接口,当我们在测试的时候,我们所测试的方法所使用的接口也是真实的接口,这是不正确的,因为我们的测试目的是测试一下我们的所写的代码是否正确,但当我们的代码依赖于其他组织的网络配置时,当其他组织的接口出现问题之后,我们的测试就会报错,所以为了我们的测试不依赖于外部的接口,我们要在测试的时候模拟接口返回数据。
解决方案
使用 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的能力还有待提高。
参考:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
智能Web算法
Haralambos Marmanis、Dmitry Babenko / 阿稳、陈钢 / 电子工业出版社 / 2011-11 / 65.00元
本书涵盖了五类重要的智能算法:搜索、推荐、聚类、分类和分类器组合,并结合具体的案例讨论了它们在Web应用中的角色及要注意的问题。除了第1章的概要性介绍以及第7章对所有技术的整合应用外,第2~6章以代码示例的形式分别对这五类算法进行了介绍。 本书面向的是广大普通读者,特别是对算法感兴趣的工程师与学生,所以对于读者的知识背景并没有过多的要求。本书中的例子和思想应用广泛,所以对于希望从业务角度更好......一起来看看 《智能Web算法》 这本书的介绍吧!
在线进制转换器
各进制数互转换器
UNIX 时间戳转换
UNIX 时间戳转换