在单元测试依赖于真实的配置及网络的时候增加模拟返回,使用MockRestServiceServer测试REST客户端

栏目: 后端 · 前端 · 发布时间: 5年前

内容简介:在我们当前的项目中我们的在请求微信获取微信企业号的时候调用微信的接口,当我们在测试的时候,我们所测试的方法所使用的接口也是真实的接口,这是不正确的,因为我们的测试目的是测试一下我们的所写的代码是否正确,但当我们的代码依赖于其他组织的网络配置时,当其他组织的接口出现问题之后,我们的测试就会报错,所以为了我们的测试不依赖于外部的接口,我们要在测试的时候模拟接口返回数据。使用通过代码来简单的介绍一下如何使用

问题描述:

在我们当前的项目中我们的在请求微信获取微信企业号的时候调用微信的接口,当我们在测试的时候,我们所测试的方法所使用的接口也是真实的接口,这是不正确的,因为我们的测试目的是测试一下我们的所写的代码是否正确,但当我们的代码依赖于其他组织的网络配置时,当其他组织的接口出现问题之后,我们的测试就会报错,所以为了我们的测试不依赖于外部的接口,我们要在测试的时候模拟接口返回数据。

解决方案

使用 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的能力还有待提高。

参考:

官方介绍


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

界面设计模式

界面设计模式

[美]泰德维尔(Tidwell,J.) / 蒋芳 / 电子工业出版社 / 2013-9-1 / CNY 119.00

模式意味着重用。 好的模式建立在对人与事物的深刻认知之上。 本书开篇即总结了“与人有关”的各类问题,为读者提供了界面设计总体思路上的指引,帮助读者举一反三。 接下来,本书收集并分析了很多常用的界面设计模式,帮助读者理解在实现级别的各种常用解决方案,将它们灵活地运用到自己的设计中。 同时,随着网络和技术的不断发展,本书在第1 版的基础上,更新了几乎所有的模式示例和说明,并新增......一起来看看 《界面设计模式》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具