繁体   English   中英

如何模拟 RestTemplate 的新实例?

[英]How to mock new instance of RestTemplate?

我为我的遗留代码编写了一个单元测试,类似于:

public class SomeClass {
public SomeResponse logToServer() {
    SomeResponse response = null;
    try{ 
        RestTemplate restTemplate = new RestTemplate();
        SomeRequestBean request = new SomeRequestBean();
        response = restTemplate.postForEntity("http://someUrl", request, SomeResponse.class);
        System.out.println(response.toString());
    } catch(Exception e) {
        e.printStackTrace();
    } 
    return response;
}

}

我知道我可以在上面移动 RestTemplate 并将其注释为@AutoWire并将其声明为 bean 类或使用 power mockito 来模拟新实例的创建。 但我不想改变这个遗留代码,我不惜一切代价避免使用强大的 Mockito,因为仅仅为了一个测试,我不想向我的pom.xml添加一个全新的依赖项。 所以只是想知道有什么方法可以模拟这个restTemplate吗?

为了回答您的问题,在您发布的限制下,无法模拟 RestTemplate 并对其进行单元测试

我确实认为您可以稍微更改遗留代码,因为此更改不起作用,在这种情况下可能值得。 但我会坚持你,你不能。

关于 power mock 和 power mockito。 虽然我同意应该避免使用这些工具,但不是出于您发布的原因。 请注意,此依赖项属于测试范围,即使对于遗留环境,它也不会到达生产环境。 因此,如果优先考虑的是不更改遗留代码,那么引入 PowerMock 是“最不邪恶的”。

不过,如果我们专门讨论 rest 模板,您可以利用一些有关 spring rest 模板的事实,这些事实无论如何都可用于测试它。

选项1

第一种技术(如果环境允许)是使用@RestClientTest注释。 它将允许指定被测试的服务,并将提供一个名为MockRestServiceServer的模拟实现,该模拟实现将代表您在模拟环境中尝试连接的服务器。 然后,您将能够指定该服务器的期望值,并希望代码能够运行。 注意:这不是单元测试 - 这是一个启动 spring 上下文的集成测试,因此它比常规单元测试更重/更慢。

在这里你可以找到这个方法的一个工作示例,查看这篇文章它也包含其他技术。

选项 2

第二种技术背后的想法是RestTemplate实际上是客户端库之上的包装器,它本身不进行任何 http 互通。

它可以配置为与 apache 的 HttpClient、OkHttpClient 一起使用,默认情况下它与 URLConnection 一起为每个请求打开连接。 因此,您可以创建一个测试,将其余客户端配置为使用您感兴趣/选择的某些特定引擎运行,然后查看如何直接测试使用该引擎的代码。 根据项目中使用的实际引擎,解决方案会有所不同。

所以,我只是想知道有什么方法可以模拟我的restTemplate吗?

简短答案:

根据规定的限制,

但是我不想更改此遗留代码,并且我不惜一切代价避免使用Power Mockito,因为我只想为一个测试添加新的依赖项到pom.xml中

可能没有其他方法可以模拟restTemplate

主题代码与实现细节/关注紧密耦合,这使得在不使用外部依赖项/工具或不重构代码以使其无法测试的情况下,很难单独进行测试。

这是技术债务要求其贷款的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM