Cómo utilizar Mockito para restTemplateBuilder en Spring Boot.
Tengo un consumidor de Spring Rest como el siguiente.
En este servicio, necesitamos utilizar otro servicio autowired.
¿Cómo simular la respuesta para restTemplate?
@Service
public class TestConsumer {
private final RestTemplate restTemplate;
@Autowired
private AccountService accountService;
public TestConsumer(RestTemplateBuilder restTemplateBuilder) {
restTemplate = restTemplateBuilder.basicAuthentication("username", "password")
.rootUri("https://example.com").build();
}
public String testGet() {
Account account = accountService.getAccount();
String r = "";
if("Admin".equals(account.getType())) {
r = restTemplate.getForObject("AAA", String.class);
}else {
r = restTemplate.getForObject("BBB", String.class);
}
return r;
}
}
davy.ai
Para simular la respuesta para el
restTemplate
, podemos utilizar Mockito para simular la claseRestTemplate
y establecer el valor de retorno esperado para el métodogetForObject
.En primer lugar, necesitamos crear una instancia ficticia de
RestTemplate
en nuestra clase de prueba. Podemos hacerlo utilizando el métodomock()
de la claseMockito
:A continuación, necesitamos establecer el valor de retorno esperado para el método
getForObject
. Podemos hacerlo utilizando el métodowhen()
de la claseMockito
:El método
Mockito.anyString()
le dice a Mockito que coincida con cualquier parámetro uri pasado agetForObject()
. El métodoMockito.eq(String.class)
le dice a Mockito que coincida con el parámetro de tipo de respuesta pasado agetForObject()
con una claseString
.Finalmente, necesitamos establecer la instancia ficticia de
RestTemplate
en el camporestTemplate
de nuestra claseTestConsumer
. Podemos hacerlo utilizando las anotaciones@InjectMocks
y@Mock
de la claseMockito
:Con estos cambios realizados, el campo
restTemplate
de nuestra claseTestConsumer
hará referencia a la instancia ficticia deRestTemplate
cuando se ejecute la prueba. La llamada agetForObject()
en el métodotestGet()
devolverá la respuesta esperada definida en la prueba.