如何模拟 restTemplate getForObject



我想使用模拟测试restTemplate.getForObject方法,但遇到了问题。我是Mockito的新手,所以我读了一些关于使用Mockito测试restTemplate的博客,但仍然无法编写成功的测试。 要测试的类是:

package rest;
@PropertySource("classpath:application.properties")
@Service
public class RestClient {
private String user;
// from application properties
private String password;
private RestTemplate restTemplate;
public Client getClient(final short cd) {
restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor(user, password));
Client client = null;
try {
client = restTemplate.getForObject("http://localhost:8080/clients/findClient?cd={cd}",
Client.class, cd);
} catch (RestClientException e) {
println(e);
}
return client;
}
public RestTemplate getRestTemplate() {
return restTemplate;
}
public void setRestTemplate(final RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
}

我的测试类:

package test;
@PropertySource("classpath:application.properties")
@RunWith(MockitoJUnitRunner.class)
public class BatchRestClientTest {

@Mock
private RestTemplate restTemplate;
@InjectMocks
private RestClient restClient;
private MockRestServiceServer mockServer;
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void getCraProcessTest() {
Client client=new Client();
client.setId((long) 1);
client.setCd((short) 2);
client.setName("aaa");
Mockito
.when(restTemplate.getForObject("http://localhost:8080/clients/findClient?cd={cd},
Client.class, 2))
.thenReturn(client);
Client client2= restClient.getClient((short)2);
assertEquals(client, client2);
}
public RestTemplate getRestTemplate() {
return restTemplate;
}
public void setRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public RestClient getRestClient() {
return restClient;
}
public void setRestClient(RestClient restClient) {
this.restClient = restClient;
}
}

它返回 null 而不是预期的客户端,对象类的restTemplate工作正常。我只想写测试.我是否错过了某些内容或以错误的方式进行了测试? 感谢您的任何指导。

请改用这个:

Mockito.when(restTemplate.getForObject(
"http://localhost:8080/clients/findClient?cd={id}",
Client.class,
new Object[] {(short)2})
).thenReturn(client);

第三个参数是varargs。 所以你需要在测试中包装成一个Object[],否则 Mockito 无法匹配它。请注意,这在您的实现中会自动发生。

也:

  • 您忘记在问题中的示例中终止url(缺少结束")。
    可能只是一个错字。

  • 您在测试的实现中使用了不同的url...?cd={cd}而不是...?cd={id}
    (正如@ArnaudClaudel之前在评论中指出的那样)。

  • 您没有为restTemplate.getInterceptors()
    定义行为,因此我希望它在尝试addBasicAuthenticationInterceptor时会因NullPointerException
    而失败。


此外,您可能想查看我的答案here以获取有关如何模拟getForObject方法的另一个示例。请注意,它不包括任何实际参数将被null的情况。

相关内容

  • 没有找到相关文章

最新更新