【发布时间】:2020-04-15 23:06:07
【问题描述】:
我正在使用 Groovy 进行开发,并且正在尝试为 Spring 的 RestTemplate 的以下使用编写一个 Spock 单元测试...
包括我的请求回调和响应提取器,以及我的 RestTemplate bean 初始化类。我正在使用 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-org.springframework.http.HttpMethod-org.springframework.web.client.RequestCallback-org.springframework.web.client.ResponseExtractor-
如何模拟这些闭包中发生的事情?具体来说,我有兴趣模拟我的响应提取器,因为我当前的测试总是将myFile 返回为空。
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
【问题讨论】:
-
你能在骨架上多放些肉,最好把你的问题变成MCVE吗?例如,我看不到您的应用程序类中的
restTemplate、requestCallback和responseExtractor来自哪里。如果后两者可以通过构造函数或setter注入,则可以注入模拟。如果它们是由某种工厂类创建的,则可以存根该类。如果在被测类本身中有工厂方法,您可以在类上使用间谍并存根工厂方法。所以你看,答案取决于具体情况。 -
@kriegaex 当然。感谢您发布该指南。目前,
requestCallback和responseExtractor在调用 restTemplate 的方法中初始化。我更新了我的帖子。如果需要更多信息,请告诉我。
标签: spring spring-boot groovy resttemplate spock