【问题标题】:How to mock new instance of RestTemplate?如何模拟 RestTemplate 的新实例?
【发布时间】:2019-11-27 05:37:31
【问题描述】:

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

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 来模拟新实例的创建。但我不想更改这个遗留代码,而且我不惜一切代价避免使用 power Mockito,因为仅仅为了一个测试我不想向我的pom.xml 添加一个全新的依赖项。所以只是想知道有什么方法可以用来模拟这个 restTemplate 吗?

【问题讨论】:

  • 这不是你的真实代码,它不会在类声明中编译。请展示一些可编译的东西,这样怪异的必须猜测哪里去了(类或方法代码)。
  • 我已经编辑了代码。但是我不能分享确切的企业级代码。但它看起来像上面那样。
  • @James 基于规定的限制,那么我会说,,可能没有其他方法可以模拟 restTemplate。主题代码与实现问题紧密耦合,这使得在没有外部依赖项/工具的情况下很难对其进行隔离测试。

标签: java junit mockito resttemplate powermockito


【解决方案1】:

为了回答您的问题,不,在您发布的限制下,没有办法模拟 RestTemplate 和 单元测试

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

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

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

选项 1

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

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

选项 2

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

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

【讨论】:

    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 2010-11-27
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多