我正在使用mockito来模拟RestTemplate交换调用。以下是我使用过的,但它并没有拿起模拟的RestTemplate。
嘲笑电话。
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, userId);
模拟的RestTempate如下。
Mockito.when(restTemplate.exchange(
Matchers.anyString(),
Matchers.any(HttpMethod.class),
Matchers.<HttpEntity<?>> any(),
Matchers.<Class<String>> any(),
Matchers.anyString())).
thenReturn(responseEntity);
知道这里出了什么问题吗?这与@RunWith(PowerMockRunner.class)一起运行,因为我在嘲笑静态内容。
答案 0 :(得分:3)
signature有Object...
作为最后一个参数,因此您必须使用anyVarArg()
。这在这里工作正常:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(MockitoJUnitRunner.class)
public class Foo {
@Mock
private RestTemplate restTemplate;
@Test
public void testXXX() throws Exception {
Mockito.when(this.restTemplate.exchange(Matchers.anyString(), Matchers.any(HttpMethod.class), Matchers.any(), Matchers.<Class<String>>any(), Matchers.<Object>anyVararg()))
.thenReturn(ResponseEntity.ok("foo"));
final Bar bar = new Bar(this.restTemplate);
assertThat(bar.foobar()).isEqualTo("foo");
}
class Bar {
private final RestTemplate restTemplate;
Bar(final RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String foobar() {
final ResponseEntity<String> exchange = this.restTemplate.exchange("ffi", HttpMethod.GET, HttpEntity.EMPTY, String.class, 1, 2, 3);
return exchange.getBody();
}
}
}
注意:使用anyVarArg
,强制转换(Object) Matches.anyVarArgs()
也可以避免模糊方法错误。
答案 1 :(得分:0)
因为我在我的方法中执行以下操作。模拟的交换方法没有约束力。
RestTempate restTempalte = new RestTemplate();
所以我将源代码更改为以下内容,并创建一个方法来创建RestTempate实例。
public RestTemplate createRestTemplate() {
return new RestTemplate();
}
在测试源中做了以下工作。
@Before
public void createMyClass() {
MockitoAnnotations.initMocks(this);
sampleClient = new SampleClient() {
@Override
public RestTemplate createRestTemplate() {
return restTemplate;
}
};
}
答案 2 :(得分:0)
我也遇到了同样的问题。这是一个对我有用的模拟。
when(this.restTemplate.exchange(anyString(),
any(),
any(),
eq(String.class),
anyString()))
.thenReturn(new ResponseEntity<>(subscriptionDataJson,
HttpStatus.OK));
请注意,我将可变参数用作 anyString()。