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 inyectar un restTemplate simulado en un servicio simulado usando @WebMvcTest en las pruebas de Spring.

Estoy intentando usar @WebMvcTest y simular mi servicio con @MockBean inyectando la variable restTemplate para simular ( junit5).

¿Cómo puedo usar una configuración de bean en el servicio simulado y cómo simular la variable restTemplate dentro del servicio simulado?
Necesito calificar restTemplate desde el servicio con la configuración ya creada.

Clase de configuración de bean
java
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

Clase de servicio

@Service
public class MyService {

    // restTemplate está llegando como null en las pruebas
    @Autowired
    private RestTemplate restTemplate;

    public ResponseEntity<object> useRestTemplate() {

        return restTemplate.exchange(
                    "url",
                    HttpMethod.POST,
                    new HttpEntity<>("..."),
                    Object.class);

    }
}

Clase de prueba

@WebMvcTest(controllers = MyController.class)
class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private MyService myService;

    @MockBean
    private RestTemplate restTemplate;

    @Test
    void test() throws Exception{

        when(gatewayRestService.useRestTemplate()).thenCallRealMethod();

        when(
                restTemplate.exchange(
                        anyString(),
                        eq(HttpMethod.POST),
                        any(HttpEntity.class),
                        eq(Object.class)
                )
        ).thenReturn(ResponseEntity.ok().body("..."));

        mockMvc.perform(
                post("/path")
                        .content("...")
                        .header("Content-Type", "application/json")
            )
            .andExpect(status().isOk() );
    }
}

He intentado usar @Import(RestTemplateConfig.class) en MyControllerTest, pero sin éxito, restTemplate sigue siendo null en las pruebas del servicio.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar una configuración de bean en el servicio simulado y simular la variable restTemplate dentro del servicio simulado, puedes hacer lo siguiente:

    1. Importa la clase RestTemplateConfig en tu clase de prueba utilizando la anotación @Import.
      @WebMvcTest(controllers = MyController.class)
      @Import(RestTemplateConfig.class) // Importa la clase RestTemplateConfig
      class MyControllerTest {
       // ...
      }
      
    2. Inyecta la dependencia restTemplate en tu servicio utilizando la anotación @Qualifier, especificando el nombre del bean definido en la clase de configuración.
      @Service
      public class MyService {
      
         // Inyecta la dependencia restTemplate con la anotación @Qualifier
         @Autowired
         @Qualifier("restTemplate")
         private RestTemplate restTemplate;
      
         // ...
      }
      
    3. Simula el bean restTemplate en tu clase de prueba utilizando la anotación @MockBean.
      @WebMvcTest(controllers = MyController.class)
      @Import(RestTemplateConfig.class)
      class MyControllerTest {
      
         // ...
      
         @MockBean
         private RestTemplate restTemplate; // Simula el bean restTemplate
      
         // ...
      }
      

    Con estos cambios, la dependencia restTemplate debería ser simulada correctamente en tus pruebas.

Comments are closed.