java - 如何模拟 RestTemplate 的新实例?

标签 java junit mockito resttemplate powermockito

我正在为我的遗留代码编写一个单元测试,如下所示:

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 和单元测试它。

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

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

如果我们专门讨论休息模板,您可以利用一些有关 Spring 休息模板的事实,无论如何都可以用于测试它。

选项 1

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

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

选项 2

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

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

关于java - 如何模拟 RestTemplate 的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59063680/

相关文章:

java - 在JAVA中以编程方式监控JVM的堆栈区域?

java - 在 § 之前附加一个特殊字符

java - 如何使用Spring Kafka的Acknowledgement.acknowledge()方法进行手动提交

java - 如何测试任何方法调用是否抛出异常?

java - 如何在 Intellij IDEA 中使用 Junit 删除自动代码完成

java - 我怎样才能简化验证一个方法是用某些参数而不是其他参数调用的?

java - hadoop java中的类路径问题

java - SimpleDateFormat 断言错误

java - 用 mockito 模拟构造函数

java - 测试具有方法依赖性的 util 类