【发布时间】:2015-06-22 14:36:09
【问题描述】:
我正在尝试模拟 Spring Rest 的 restTemplate.exchange 方法。
在同一个测试中,我有多个调用,只是返回类型不同。
这是我创建的模拟的方法
第一
// Original method
restTemplate.exchange(UrlMap.SEARCH + '?' + searchDocsForm.toQueryParams(),
HttpMethod.GET, null, new ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>() {
})
// Mock
when(restTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.<ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>>any())).thenReturn(
new ResponseEntity<>(searchResultsDTO, HttpStatus.OK));
第二
// Original method
restTemplate.exchange(UrlMap.ALL_DOCUS_TOPICS,
HttpMethod.GET, null, new ParameterizedTypeReference<List<SelectItem>>() {
}).getBody();
// Mock
when(restTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.<ParameterizedTypeReference<List<SelectItem>>>any())).thenReturn(
new ResponseEntity<>(selectItems, HttpStatus.OK));
模拟不考虑ParameterizedTypeReference的泛型参数,最后定义的模拟胜过前者。
有没有办法让它工作?
【问题讨论】:
-
可以通过创建自定义参数匹配器来实现。我知道这是可能的,但是我从来没有这样做过,所以我无法提供进一步的帮助,抱歉:((编辑:link)
-
仅供参考,始终将
any(String.class)替换为anyString(),anyInt()、anyFloat()等类似...更简单、更简洁、更容易看,并且不受类型擦除。
标签: java spring unit-testing mockito