rest - 如何销毁 MockRestServiceServer?

标签 rest unit-testing spring-test

我们正在使用 RestTemplate 来消费外部休息服务。我们的项目中有很多不同类型的服务,所有这些服务都使用不同的策略进行测试,例如模拟休息模板和模拟我们的通信对象。

我们在测试用例中使用了以下代码来使用 MockRestServiceServer 测试一项服务:

RestTemplate restTemplate = new RestTemplate();    
mockServer = MockRestServiceServer.createServer(restTemplate);

所以我们的问题是:
有没有办法在此测试用例完成后立即销毁此服务器,以免影响其他测试用例?

最佳答案

首先,MockRestServiceServer不是真正的服务器——例如,它没有监听 TCP 端口。唯一的MockRestServiceServer做的是修改你的RestTemplate (详见下文)。

所以回答你的问题:没有要销毁的服务器。

但是...如果您的 RestTemplate在您的 ApplicationContext 中创建并注入(inject)多个组件(例如,在您的服务层中),您可能需要重置 RestTemplate 的初始状态.如果是这种情况,请继续阅读...

当前没有“官方”方式来重置 RestTemplate传递给 MockRestServiceServer.createServer() ,但这并不意味着您不能自己实现这样的功能。

理解这一点的关键是知道 MockRestServiceServer.createServer()方法替换 ClientHttpRequestFactory在提供的RestTemplate使用模拟版本(即私有(private)的内部 MockRestServiceServer.RequestMatcherClientHttpRequestFactory )。

所以你应该能够重置 RestTemplate 的原始状态。通过跟踪原始请求工厂并在测试后将其设置在模板中。像下面这样的东西应该可以工作:

RestTemplate restTemplate = // likely injected into the test
ClientHttpRequestFactory originalRequestFactory = restTemplate.getRequestFactory();
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

try {
    // use mockServer as usual...

    mockServer.verify();
} finally {
    restTemplate.setRequestFactory(originalRequestFactory);
}

让我知道这是否能解决您的问题!

干杯,

Sam(Spring TestContext 框架的作者)

关于rest - 如何销毁 MockRestServiceServer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31957447/

相关文章:

java - 在与 JUnit SpringRunner 的集成测试期间未加载 SpringApplicationBuilder

java - RESTful Web 服务中复合对象的 URI

sql - 通过 SQL Server 存储过程访问 REST 服务的方法?

java - 为什么 TestExecutionListener 中的 beforeTestClass 和 afterTestClass 方法中 TestContext.getInstance() 为 null?

node.js - Mocha 重试不起作用

ios - OCMock 模拟 UIImagePickerController

spring - 在集成测试中使用 Spring @ActiveProfile

Javax REST 响应实体 = null

java - 限制 RESTful 服务的拨出调用数量

unit-testing - TestBed:通过模块导入时组件不编译