如何对接收ResponseExtractor和RequestCallback的Spring RestTemplate进行



我正在Groovy中进行开发,并试图编写一个Spock单元测试,以用于以下Spring的RestTemplate。。。

其中包括我的请求回调和响应提取器,以及RestTemplatebean的初始化类。我正在使用ResponseExtractor从GET myurl/流式传输响应并将其复制到文件中。RequestCallback只是在请求上设置一些头。

class RestTemplateConfig() {
@Bean(name = 'myRestTemplate')
RestTemplate getMyRestTemplate() {
RestTemplate restTemplate = new RestTemplateBuilder().build()
return restTemplate
}
}
class MyClass() {
@Autowired
@Qualifier('myRestTemplate')
RestTemplate restTemplate
File getFile() {
ResponseExtractor<Void> responseExtractor = { ClientHttpResponse response ->
// do something with the response
// in this case, the response is an input stream so we copy the input stream to a file
myFile = response.getBody() // roughly, in a psuedocode-ish way
return null
}
RequestCallback requestCallback = { ClientHttpRequest request ->
request.getHeaders().setAccept([MediaType.APPLICATION_JSON])
}
File myFile
// get my file data
restTemplate.execute('myurl/', HttpMethod.GET, requestCallback, responseExtractor)
return myFile
}
}

特定execute(...)方法的Spring框架文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#execute-java.net.URI-or.springframework.http.HttpMethod-or.springframework.web.client.RequestCallback-or.springbramework.web-client.ResponseTextractor-

我该如何模拟这些闭包中发生的事情?具体来说,我有兴趣嘲笑我的响应提取器,因为我当前的测试总是将myFile返回为null。

when:
// do stuff
then:
1 * restTemplate.execute('myurl/, HttpMethod.GET, _, _) // how can I mock out the expected response here?
0 * _
myFile != null // this fails because myFile is null

按照我的要求更新了示例代码后,我现在可以看得更清楚了。您正遭受一个典型的(非(可测试性问题:您的方法getFile所做的不仅仅是获取一个文件。它将两个依赖项实例化为局部变量,使它们不可锁定,从而使整个方法基本上不可稳定。

因此,您需要进行重构以获得更好的可测试性,从而能够使用我在第一条评论中提到的一种测试方法:

  • 如果requestCallbackresponseExtractor可以通过构造函数或setter注入,则可以注入mock
  • 如果它们是由某种工厂类创建的,则可以存根该类
  • 如果在测试中的类内部有工厂方法,您可以对该类使用间谍并存根工厂方法

有关可测试性以及测试如何驱动应用程序设计的更一般性讨论,请参阅我在此处的另一个答案,即"常规注释"one_answers"更新"部分。

如果其中任何一个不清楚,请随时询问相关的(!(后续问题。

最新更新