资讯专栏INFORMATION COLUMN

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

yedf / 3092人阅读

摘要:解决方案使用类来解决,根据官方文档描述,该类主要用于设计直接或间接使用的测试,通过设置的预期请求,来模拟发送回来的响应,来消除对实际请求的依赖。

问题描述:

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

解决方案

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

参考:

官方介绍

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74502.html

相关文章

  • 随行付微服务单元

    摘要:输出结果需要人工检查的测试不是一个好的单元测试。为了有效的进行单元测试,需要遵循一定的方法,通常采用路径覆盖法设计单元测试用例。 在微服务架构下高覆盖率的单元测试是保障代码质量的第一道也是最重要的关口,应该持之以恒。 背景 单元测试为代码质量保驾护航,是提高业务质量的最直接手段,实践证明,非常多的缺陷完全可以通过单元测试来发现,测试金字塔提出者Martin Fowler 强调如果一个高...

    xiguadada 评论0 收藏0
  • 论性能

    摘要:吞吐量一般结合业务需求而定服务器资源占用占用率内存使用率命中率篇是一种预测系统行为和性能的负载测试工具。负载测试与压力测试都是性能测试。通过平台接口可进行合理的性能测试。有利于测试人员及时定位问题。 Part 1:性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 A. 类别 性能测试包括负载测试、压力测试、基准测试等。 i. 负...

    qpal 评论0 收藏0
  • ❤️软件经典10题(含解析) 软件行业,去大公司还是小公司好?❤️

    年轻人都会犯的3个职场错误,你有几个? 测试人员如何才能快速成长? 软件测试行业,去大公司还是小公司好? 同学们可以用这 10 道题目,找到自己的薄弱点,对症下药哦。 我的建议是:你们可以拿出纸笔,写下这 10 道题的答案,然后再与文末的答案进行对照~ 选择题 1. (单选)当需要对某个系统进行测试的时候,应该从哪些方面来设计测试用例? A. 功能验证 B. 性能相关的验证 C. 兼容性相关的验...

    zhunjiee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<