如何销毁 MockRestServiceServer?

How to destroy MockRestServiceServer?

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

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

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

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

首先,MockRestServiceServer 不是真正的服务器——例如,它没有在 TCP 端口上侦听。 MockRestServiceServer 所做的唯一一件事就是修改您的 RestTemplate(请参阅下面的详细信息)。

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

但是...如果您的 RestTemplate 是在您的 ApplicationContext 中创建并注入到多个组件中(例如,在您的服务层中),您可能需要重置 RestTemplate。如果是这样,请继续阅读...

目前没有 "official" 方法来 重置 传递给 MockRestServiceServer.createServer()RestTemplate,但这并不意味着你可以'不要自己实现这样的功能。

理解这一点的关键是知道 MockRestServiceServer.createServer() 方法将提供的 RestTemplate 中的 ClientHttpRequestFactory 替换为 mocked 版本(即,私有的内部 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 Framework 的作者)