我正在为我的遗留代码编写一个单元测试,如下所示:
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/