🕹 Simular una pasarela de pagos (en este caso con Mockito) nos ayuda a probar todas las funcionalidades de nuestra aplicación sin gastar dinero en pagos reales 💸.
Bienvenida e Introducción
Paso a paso para testing básico en Java
Introducción a tests en software
Tipos y beneficios de los tests
Preparación del IDE, proyecto y librerías
Instalación de IntelliJ IDEA, creación del Proyecto con Maven y Tests Unitarios
Testing en Java con JUnit para Verificar Contraseñas
Creación de test unitario: lanzar una excepción para alertar sobre un error
Test unitario con JUnit
Organización de tests con JUnit
Test con Mockito para simular un dado
Test con Mockito: simular el uso de una pasarela de pago
Análisis de los tests y mejoras
Reto 1: crear la función isEmpty
TDD
TDD: Definición, Beneficios, Ciclos y Reglas
Ejemplos de TDD: calcular el año bisiesto
Ejemplos de TDD: cálculo de descuentos
Reto 2: Práctica de TDD
Tests en una aplicación
Organización de una aplicación
App de Películas: Test de Negocio
App de Películas: test de búsqueda de películas por su duración
Creación de la base de datos y tests de integración con bases de datos
Test de integración con base de datos: guardar películas y búsqueda de películas individuales
Reto 3: Nuevas opciones de búsqueda
Requerimientos y tests
Test a partir de requerimiento
Reto 4: Búsqueda por varios atributos
Conclusiones
Resumen y conclusiones
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
Aportes 27
Preguntas 6
🕹 Simular una pasarela de pagos (en este caso con Mockito) nos ayuda a probar todas las funcionalidades de nuestra aplicación sin gastar dinero en pagos reales 💸.
Super confuso
Muy interesante y la verdad genial como funciona, pero sinceramente uds creen que explciando un proyecto haciendolo a la velocidad de la luz sera claro? creo seria mejor que explicaran con mas pausa y detalles, pues asi como hay gente que tiene idea hay otros que no tanto y mas en este tipo de clases que tienen varias cosas. Esto lo digo porque en mi ruta siempre tienden a hacer lo mismo.
Se ve en esta clase una simulación un poco más compleja, donde se interactúa con un Api de pagos, para simular la creación de objetos que son los que habitualmente se crean para ejecutar un request y response.
Se ve la nueva instrucción Método(Mockito.any()).thenReturn **
La cual sirve para poder indicar al método que en cualquier llamada el método siempre retorne lo que se indica en thenReturn.
Si estás trabajando con Kotlin debes de colocar el tipo de objeto que desea recibir el método Mockito.any(ClaseBase::Class.java)** y además indicar en tu método que este valor puede ser nulo, de lo contrario el IDE marcara un error.
PaymentGateway.java
package com.platzi.javatests.payments;
public interface PaymentGateway {
PaymentResponse requestPayment(PaymentRequest request);
}
PaymentRequest.java
package com.platzi.javatests.payments;
public class PaymentRequest {
private double amount;
public PaymentRequest(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
PaymentProcessor.java
package com.platzi.javatests.payments;
import static com.platzi.javatests.payments.PaymentResponse.PaymentStatus.OK;
public class PaymentProcessor {
private PaymentGateway paymentGateway;
public PaymentProcessor(PaymentGateway paymentGateway) {
this.paymentGateway = paymentGateway;
}
public boolean makePayment(double amount) {
PaymentResponse response = paymentGateway.requestPayment(new PaymentRequest(amount));
return response.getStatus() == OK;
}
}
PaymentResponse.java
package com.platzi.javatests.payments;
public class PaymentResponse {
enum PaymentStatus {
OK, ERROR
}
private PaymentStatus status;
public PaymentResponse(PaymentStatus status) {
this.status = status;
}
public PaymentStatus getStatus() {
return status;
}
}
PaymentProcessorTest.java
package com.platzi.javatests.payments;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static com.platzi.javatests.payments.PaymentResponse.PaymentStatus.ERROR;
import static com.platzi.javatests.payments.PaymentResponse.PaymentStatus.OK;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class PaymentProcessorTest {
@InjectMocks
PaymentProcessor paymentProcessor;
@Mock
PaymentGateway paymentGateway;
@Test
public void makePayment_whenPaymentIsCorrect() {
paymentProcessor = new PaymentProcessor(paymentGateway);
// any(): Simulate with mockito classes that can not be tested directly (PaymentRequest).
when(paymentGateway.requestPayment(any())).thenReturn(new PaymentResponse(OK));
assertTrue(paymentProcessor.makePayment(1000));
}
@Test
public void makePayment_whenPaymentIsWrong() {
paymentProcessor = new PaymentProcessor(paymentGateway);
// any(): Simulate with mockito classes that can not be tested directly (PaymentRequest).
when(paymentGateway.requestPayment(any())).thenReturn(new PaymentResponse(ERROR));
assertFalse(paymentProcessor.makePayment(1000));
}
}
Les dejo el UML por si les ayuda a ver mejor la relación entre las clases 😃
Si les resulta un poco incómodo o confuso el naming de los tests, utilizado por el profesor, les dejo algunas convenciones de naming para que las apliquen a sus propios tests.
Ahí les va:
Es buena practica realizar el nombramiento de las funciones con el **underscore ** o se puede usar otras técnicas como camelCase ?
PD: Me encanta el hecho de simular las clases con Mockito, ya no hay excusas para no probar el código. 😄
Que interesante me gustaria que hubiera un pdf del curso
muy interesante, pero falta poner en contexto como funciona la pasarela de pago antes de implementar, para poder entender… No entendí esta sesión.
Pues mira la verdad no estoy entendiendo nada sé que es la definición de mockito y Junit, pero no entiendo lo que hacen algunas funciones que el profesor usa. Espero complementar este curso con alguna playlist en internet o YouTube, además me ha parecido que el profesor codifica muy rápido y no detalla algunas funciones que usa :v
¿Alguien me explica cómo funciona Mockito.any()?
Entiendo que el método requestPayment recibe como parámetro un PaymentRequest al cual se le debe pasar una cantidad ¿Podría instanciar una clase en vez de utilizar el Mockito.any()?
Se me hace un poco difícil terminar de entender completamente el código.
En Eclipse no funciono directamente el Mockito.Any(). Fue necesario un casteto.
Está increíble este curso, la forma en que explica las temáticas y hasta los comandos para ir más rápido en la creación de código, es genial, me encanta.
Mockito.any()
procesa cualquier petición que se le mande al Mock por parámetro
Buenas tardes, en algun momento utilizaran o explicaran el uso de PowerMockito?
creo que para poderle seguir el ritmo a este profe me voy a tener que hacer unos cuantos proyectos por mi cuenta, entiendo los test y todo eso pero no puedo seguir el código del profe, las clases y los métodos que va creando y como funciona todo junto, me falta mas programación en java.
Me encantó esta clase.
Sobre Mockito algo interesante, Mockito es un marco de simulación de Java que tiene como objetivo proporcionar la capacidad de escribir con claridad una prueba de unidad legible utilizando su API simple. Se diferencia de otros marcos de simulacros al dejar el patrón de esperar-ejecutar-verificar que la mayoría de los otros marcos utilizan.
En su lugar, solo conoce una forma de simular las clases e interfaces (no final) y permite verificar y apilar basándose en comparadores de argumentos flexibles.
Se puede usar el annotetion inyectmock cuando estas probando una clase en si
@InyectMock
PaymentGateway payment
Chevere la explicación de como hacer mock de clases que son externas al sistema muy buena para realizar los test
Excelente explicación instructor Ferran, ahora me queda más claro cómo utilizar mejor estos métodos para poder realizar pruebas y aplicarlas al funcionamiento de la aplicación.
Gracias
Entendido 😃
😎 Great!
Muy buen video.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.