【问题标题】:How to destroy MockRestServiceServer?如何销毁 MockRestServiceServer?
【发布时间】:2015-08-12 06:22:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: rest unit-testing spring-test


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢。这就像一个魅力。谢谢你的详细解释。
    • @TusharPatel 你应该标记为已接受这个答案:)
    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多