Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso Básico de Testing en Java

Curso Básico de Testing en Java

Ferran Maylinch Carrasco

Ferran Maylinch Carrasco

Test con Mockito: simular el uso de una pasarela de pago

9/24
Recursos

Aportes 27

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

🕹 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:

  1. MethodName_StateUnderTest_ExpectedBehavior: Algunos ejemplos son:
    • isAdult_AgeLessThan18_False
    • withdrawMoney_InvalidAccount_ExceptionThrown
    • admitStudent_MissingMandatoryFields_FailToAdmit
  2. MethodName_ExpectedBehavior_StateUnderTest: Algunos ejemplos son:
    • isAdult_False_AgeLessThan18
    • withdrawMoney_ThrowsException_IfAccountIsInvalid
    • admitStudent_FailToAdmit_IfMandatoryFieldsAreMissing
  3. test[Feature being tested]: Algunos ejemplos son:
    • testIsNotAnAdultIfAgeLessThan18
    • testFailToWithdrawMoneyIfAccountIsInvalid
    • testStudentIsNotAdmittedIfMandatoryFieldsAreMissing
  4. Feature to be tested: Algunos ejemplos son:
    • IsNotAnAdultIfAgeLessThan18
    • FailToWithdrawMoneyIfAccountIsInvalid
    • StudentIsNotAdmittedIfMandatoryFieldsAreMissing
  5. Should_ExpectedBehavior_When_StateUnderTest: Algunos ejemplos son:
    • Should_ThrowException_When_AgeLessThan18
    • Should_FailToWithdrawMoney_ForInvalidAccount
    • Should_FailToAdmit_IfMandatoryFieldsAreMissing
  6. When_StateUnderTest_Expect_ExpectedBehavior: Algunos ejemplos son:
    • When_AgeLessThan18_Expect_isAdultAsFalse
    • When_InvalidAccount_Expect_WithdrawMoneyToFail
    • When_MandatoryFieldsAreMissing_Expect_StudentAdmissionToFail
  7. Given_Preconditions_When_StateUnderTest_Then_ExpectedBehavior: Algunos ejemplos son:
    • Given_UserIsAuthenticated_When_InvalidAccountNumberIsUsedToWithdrawMoney_Then_TransactionsWillFail

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.