es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para simular la respuesta para el restTemplate, podemos utilizar Mockito para simular la clase RestTemplate y establecer el valor de retorno esperado para el método getForObject.

    En primer lugar, necesitamos crear una instancia ficticia de RestTemplate en nuestra clase de prueba. Podemos hacerlo utilizando el método mock() de la clase Mockito:

    RestTemplate restTemplateMock = Mockito.mock(RestTemplate.class);
    

    A continuación, necesitamos establecer el valor de retorno esperado para el método getForObject. Podemos hacerlo utilizando el método when() de la clase Mockito:

    String expectedResponse = "respuesta ficticia";
    Mockito.when(restTemplateMock.getForObject(Mockito.anyString(), Mockito.eq(String.class)))
        .thenReturn(expectedResponse);
    

    El método Mockito.anyString() le dice a Mockito que coincida con cualquier parámetro uri pasado a getForObject(). El método Mockito.eq(String.class) le dice a Mockito que coincida con el parámetro de tipo de respuesta pasado a getForObject() con una clase String.

    Finalmente, necesitamos establecer la instancia ficticia de RestTemplate en el campo restTemplate de nuestra clase TestConsumer. Podemos hacerlo utilizando las anotaciones @InjectMocks y @Mock de la clase Mockito:

    @InjectMocks
    private TestConsumer testConsumer;
    
    @Mock
    private RestTemplate restTemplateMock;
    
    @Test
    public void testGet() {
        // establecer respuesta ficticia
        String expectedResponse = "respuesta ficticia";
        Mockito.when(restTemplateMock.getForObject(Mockito.anyString(), Mockito.eq(String.class)))
            .thenReturn(expectedResponse);
    
        // llamar al método de prueba
        String actualResponse = testConsumer.testGet();
    
        // verificar respuesta
        assertEquals(expectedResponse, actualResponse);
    }
    

    Con estos cambios realizados, el campo restTemplate de nuestra clase TestConsumer hará referencia a la instancia ficticia de RestTemplate cuando se ejecute la prueba. La llamada a getForObject() en el método testGet() devolverá la respuesta esperada definida en la prueba.

Comments are closed.