如何销毁MockRestServiceServer?

Tus*_*tel 1 rest unit-testing spring-test

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

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

RestTemplate restTemplate = new RestTemplate();    
mockServer = MockRestServiceServer.createServer(restTemplate);
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*nen 6

首先,MockRestServiceServer它不是真正的服务器 - 例如,它不是在侦听TCP端口.唯一MockRestServiceServer能做的就是修改你的RestTemplate(见下面的详细信息).

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

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

目前还没有"正式"的方式重新设置的RestTemplate传递给MockRestServiceServer.createServer(),但是,这并不意味着你不能在实现自己这样的功能.

理解这一点的关键是知道该MockRestServiceServer.createServer()方法替换了ClientHttpRequestFactory提供RestTemplate的模拟版本(即私有,内部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);
}
Run Code Online (Sandbox Code Playgroud)

如果能解决您的问题,请告诉我!

干杯,

Sam(Spring TestContext Framework的作者)