【发布时间】:2017-11-14 14:33:12
【问题描述】:
谁能给我一个例子,如何使用 Spock 测试 RestTemplate。 我的课程如下所示:
@Service
public class SomeService {
@Autowired
private EndpointUrlProvider endpointUrlProvider;
private RestTemplate restTemplate = new RestTemplate();
public SomeResponse doSomePostRequest(HttpEntity<?> httpEntity) throws Exception {
ResponseEntity<SomeResponse> response;
try{
response = restTemplate.postForEntity(endpointUrlProvider.getSomeUrl(),httpEntity,SomeResponse.class);
} catch (Exception e){
throw new Exception("Exception occured during post for:" + httpEntity.getBody().getClass().getSimpleName() + " Cause: " + e.getMessage());
}
if(response.getStatusCode() == HttpStatus.OK){
return response.getBody();
}
throw new Exception("Error during " + response.getBody().getClass().getSimpleName() + "Http status is diffrent than 200: " + response.getBody().toString());
}
}
测试:
class SomeTest extends Specification {
RestTemplate restTemplate = Mock {
postForEntity(_, _, SomeResponse.class) >> new ResponseEntity(new SomeResponse(), HttpStatus.OK)
}
@Autowired
SomeService someService
def "someTest"() {
when:
SomeResponse someResponse = someService.doSomePostRequest(new HttpEntity<>(new SomeBody(), new HttpHeaders()))
then:
someResponse == new SomeResponse()
}
}
主要问题是模拟 RestTemplate 的行为,我正在寻找解决方案如何以正确的方式做到这一点。我不使用弹簧靴。
【问题讨论】:
-
什么不起作用?至于
someResponse == new SomeResponse(),这只有在SomeResponse覆盖equals时才有效,否则肯定会失败。 -
感谢您的建议,但是当我运行测试 postForEntity() 方法时,问题出在其他地方,而不是返回在模拟中声明的值
标签: java spring mocking spock resttemplate