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.

Re-direccione las solicitudes a las Clases de Utilidad de SideEffect.

Para una aplicación de Spring Boot que necesita ser probada, a continuación se muestra mi consulta.

@CustomLog
@RestController
@RequestMapping("/my_path")
public class MyController {
    @GetMapping(path = "**", produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<jsonnode> fetchData(HttpServletRequest request){
      ... algún código.....que también llama a APIs externas.....
      }
    @PostMapping(path = "**", produces = {MediaType.APPLICATION_JSON_VALUE})
    @ResponseBody
    public ResponseEntity<><string, object="">> createMOI(HttpServletRequest request){
          ... algún código.....que también llama a APIs externas.....
      }
    }

Mi aplicación llama a un servicio externo que ahora necesita ser simulado.

this.webClient = WebClient.builder().baseUrl("http://localhost:9600/external_host_path")
                .defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE)
                .build();
Mono<pojo> responseMo = webClient.post().uri("/aGivenSubPath")
                       .accept(MediaType.APPLICATION_JSON).bodyValue(requestPoJo)
                       .retrieve().bodyToMono(Pojo.class).block();

Estoy llamando a la API de mi controlador con MVC como parte de springtest.

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyControllerTest {
  @Autowired
  MyController controller;
  @Before
  public void setup() throws Exception {
    this.mockMvc = standaloneSetup(this.controller).build();
  }
  @Test
  public void testControl() throws Exception {
    mockMvc
    .perform(post("http://localhost:9600/my_path")
    .contentType(MediaType.APPLICATION_JSON)
    .content("{'someData':'[]'}"))
    .andExpect(status().isAccepted())
  .andReturn();
  }
}

Lo que estoy buscando es de alguna manera interceptar o afectar

http://localhost:9600/external_host_path

y redirigir todas las llamadas realizadas a este host a una clase de utilidad personalizada que proporcione una respuesta basada en los parámetros de solicitud al host externo de forma programática.

He visto múltiples ejemplos de mockito, wireMock, mockwebserver, mockserver, etc., pero la mayoría de ellos funcionan en una ruta dada (ruta estática) – cuando se llama una ruta estática – luego se proporciona una respuesta estática. Tengo muchas llamadas en todo el flujo y ya tengo la lógica de la clase de utilidad para generar respuestas para los argumentos de solicitud proporcionados.</string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para simular el servicio externo llamado en la aplicación Spring Boot, puedes usar una biblioteca de simulación dinámica como MockServer para interceptar y responder a las solicitudes HTTP realizadas por la aplicación en tiempo de ejecución.

    Aquí tienes los pasos generales para lograr esto:

    1. Agrega la dependencia de MockServer al alcance de prueba de tu proyecto.
    <dependency>
        <groupid>org.mock-server</groupid>
        <artifactid>mockserver-netty</artifactid>
        <version>5.10.0</version>
        <scope>test</scope>
    </dependency>
    
    1. Crea una instancia de MockServer en tu clase de prueba y configúrala para interceptar las solicitudes realizadas al servicio externo.
    MockServerClient mockServerClient = new MockServerClient("localhost", 9600);
    mockServerClient.when(request().withPath("/external_host_path/aGivenSubPath")
            .withMethod("POST")
            .withBody(json(requestPoJo)))
            .respond(response().withBody(json(responsePoJo)));
    
    1. Inyecta la URL del servidor externo en el código de tu aplicación como una propiedad, de modo que puedas alternar fácilmente entre los servidores reales y simulados durante las pruebas.
    externalServiceUrl=http://localhost:9600/external_host_path
    
    1. Modifica el código de tu aplicación para obtener la URL del servidor externo desde la propiedad y usarla al realizar solicitudes al servidor. Por ejemplo, puedes modificar la creación de WebClient para reemplazar la URL codificada por una búsqueda de propiedad.
    @Value("${externalServiceUrl}")
    private String externalServiceUrl;
    
    this.webClient = WebClient.builder()
            .baseUrl(externalServiceUrl)
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .build();
    
    1. Ejecuta tu caso de prueba y verifica que el código de la aplicación realice solicitudes al MockServer en lugar del servidor real, y que reciba las respuestas esperadas.

    Ten en cuenta que es posible que debas ajustar la configuración de WebClient y MockServer para que se adapten a los requisitos de tu caso de uso específico. Por ejemplo, es posible que debas configurar SSL o manejar la autenticación.

Comments are closed.