Simulación de Pasarelas de Pago con Mockito
Clase 9 de 24 • Curso Básico de Testing en Java
Resumen
¿Cómo simular una pasarela de pago en nuestro programa?
Simular una pasarela de pago en nuestros programas de desarrollo es crucial para evitar transacciones reales durante la fase de pruebas. El control total sobre el flujo de pagos en un entorno simulado es esencial para desarrollar aplicaciones robustas y seguras. A continuación, exploraremos cómo hacerlo utilizando interfaces y librerías de mockeo en una aplicación Java.
¿Cómo configurar las clases de pago?
Para crear una pasarela de pago simulada, primero definimos una interfaz que representará nuestra pasarela de pago. En este caso, llamaremos a esta interfaz PaymentGateway
. Esta interfaz contará con un método clave:
public interface PaymentGateway {
PaymentResponse requestPayment(PaymentRequest request);
}
Adicionalmente, se crearán las clases PaymentRequest
y PaymentResponse
, que manejarán los detalles de las solicitudes y respuestas de pago:
-
PaymentResponse:
- Tiene un campo
PaymentStatus
que puede serOK
oERROR
. - Un constructor y un getter para obtener el estado del pago.
- Tiene un campo
-
PaymentRequest:
- Recibe un monto (
amount
) como parámetro necesario para procesar la transacción. - Constructor y getter para el campo
amount
.
- Recibe un monto (
¿Cómo crear un PaymentProcessor
?
La clase PaymentProcessor
es responsable de gestionar los pagos integrándose con la pasarela de pago simulada. Esta clase posee un método que devuelve un booleano indicando el éxito o fallo del proceso de pago:
public class PaymentProcessor {
private PaymentGateway gateway;
public PaymentProcessor(PaymentGateway gateway) {
this.gateway = gateway;
}
public boolean makePayment(double amount) {
PaymentRequest request = new PaymentRequest(amount);
PaymentResponse response = gateway.requestPayment(request);
return response.getStatus() == PaymentStatus.OK;
}
}
¿Cómo probar la clase con Mockito?
Una vez configuradas las clases, procederemos a crear pruebas para asegurar su correcto funcionamiento. Utilizaremos Mockito para simular el comportamiento del PaymentGateway
:
-
Simulación correcta del pago:
- Configurar Mockito para retornar un
PaymentResponse
con un estadoOK
cualquier sea elPaymentRequest
recibido. - Verificar que el método
makePayment
retorna verdadero cuando la respuesta de la pasarela de pago es exitosa.
- Configurar Mockito para retornar un
-
Simulación de un pago con error:
- Simular con Mockito que la pasarela devuelve un estado
ERROR
. - Verificar que
makePayment
retorne falso en este escenario.
- Simular con Mockito que la pasarela devuelve un estado
@Test
public void testPaymentProcessor() {
PaymentGateway mockGateway = mock(PaymentGateway.class);
when(mockGateway.requestPayment(any(PaymentRequest.class)))
.thenReturn(new PaymentResponse(PaymentStatus.OK));
PaymentProcessor processor = new PaymentProcessor(mockGateway);
assertTrue(processor.makePayment(100.0));
}
@Test
public void testPaymentProcessorWithError() {
PaymentGateway mockGateway = mock(PaymentGateway.class);
when(mockGateway.requestPayment(any(PaymentRequest.class)))
.thenReturn(new PaymentResponse(PaymentStatus.ERROR));
PaymentProcessor processor = new PaymentProcessor(mockGateway);
assertFalse(processor.makePayment(100.0));
}
¿Cuáles son los beneficios de usar Mockito?
El uso de Mockito nos permite:
- Simular clases y comportamientos que no podemos interactuar directamente, como las pasarelas de pago reales.
- Controlar respuestas específicas para evaluar cómo las clases manejan diferentes escenarios.
- Asegurar que nuestro
PaymentProcessor
reacciona correctamente a las distintas respuestas de pago.
A través de este enfoque, se consigue un alto grado de control y seguridad al probar el comportamiento de las aplicaciones en situaciones reales sin incurrir en costos asociados con operaciones financieras efectivas. Así, garantizamos un entorno de pruebas eficaz y fiable.