我正在使用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(一起运行,因为我正在模拟静态内容。
签名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()
也可以避免歧义方法错误。
我在为同样的问题而苦苦挣扎。这是一个对我有用的模拟。
when(this.restTemplate.exchange(anyString(),
any(),
any(),
eq(String.class),
anyString()))
.thenReturn(new ResponseEntity<>(subscriptionDataJson,
HttpStatus.OK));
请注意,我使用 varargs 作为 anyString((。
因为我在我的方法中执行以下操作。模拟交换方法不具有约束力。
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;
}
};
}