No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Básico de Testing en Java

Curso Básico de Testing en Java

Ferran Maylinch Carrasco

Ferran Maylinch Carrasco

Análisis de los tests y mejoras

10/24
Recursos

Nuestros test siguen un mismo proceso:

  1. Se preparan los objetos que vamos a probar.
  2. Llamamos al método que estamos probando.
  3. Comprobamos los resultados.

Podemos reducir la cantidad de código moviendo las partes comunes de preparación a una función que se ejecute antes de cada prueba.
Con @Before le indicamos a JUnit la función que debe ejecutar antes de cada prueba.

Aportes 22

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Como apunte adicional, la anotación @BeforeClass se puede utilizar en métodos estáticos para ejecutar instrucciones al principio de todos los tests de esa clase. Esto puede usarse para operaciones costosas como conexiones a bases de datos que no quieras ejecutar antes de cada uno de los tests (que en una aplicación escalable pueden ser muchos).

Para los que utilizan Junit 5 ya no se utiliza @Before si no @BeforeEach

Los test normalmente se dividen en tres partes:
1° - Preparación del escenario (objetos que van a ser utilizados en el test).
2° - Llamada al método que se quiere probar.
3° - Comprobación de que el resultado es el esperado.

Las métodos test regularmente cuentan con tres secciones.

Preparación
Preparación de lo que se probara.
Llamada
Es la ejecución del método que se probara
Comprobación
Se evalúa el resultado.

Si se realizaran pruebas sobre los mismo objetos se puede refactorizar dicho código y colocarlo en un método que se nombra **setup **por defecto, a este método se lo coloca el decorador @Before, este nos ayuda a indicarle a los test que este método se debe lanzar antes en cada método.

package com.platzi.javatests.payments;

import org.junit.Before;
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;

  @Before
  public void setUp() {
    paymentProcessor = new PaymentProcessor(paymentGateway);
  }

  @Test
  public void makePayment_whenPaymentIsCorrect() {
    when(paymentGateway.requestPayment(any())).thenReturn(new PaymentResponse(OK));

    assertTrue(paymentProcessor.makePayment(1000));
  }

  @Test
  public void makePayment_whenPaymentIsWrong() {
    when(paymentGateway.requestPayment(any())).thenReturn(new PaymentResponse(ERROR));

    assertFalse(paymentProcessor.makePayment(1000));
  }
}

Mis apunts de las últimas 3 clases 😄

JUnit4 vs JUnit5:

@Before -> @BeforeEach (antes de cada test individual)
@BeforeClass -> @BeforeAll (antes de todos los tests)

Segun la explicacion del profesor, para este ejemplo con JUnit5 usaremos @BeforeEach

Viene muy bien este curso!!! Hasta ahora lo mejorcito de Java que hay en Platzi

Estructura de los test
//Given
//When o SUT “System Under Testing”
//Then = Validar los resultados.

Por fin un buen curso en Platzi!

mi aporte: <https://github.com/Jeixonx/testingJava/commit/ffd1fc5fcb1e55279e035488221935366649f782>

Genial la explicacion

`public void setup(PaymentStatus paymentStatus){` ` this.paymentGateway = Mockito.``mock``(PaymentGateway.class);` ` Mockito.``when``(this.paymentGateway.requestPayment(Mockito.``any``())).thenReturn(new PaymentResponse(` ` paymentStatus));` ` this.paymentProcessor = new PaymentProcessor(this.paymentGateway);` `}` `@Test` `public void when_payment_is_correct() {` ` this.setup(PaymentStatus.``OK``);` ` Boolean result = this.paymentProcessor.makePayment(1000);` ` ``assertTrue``(result);` `}`

En JUnit 5 no encontré un @Before pero sí un @BeforeClass que hace lo mismo (solo es el renaming me imagino).

Lo único es que tendremos que hacer de nuestros métodos unos estáticos.

private static PaymentGateway paymentGateway;
private static PaymentProcessor paymentProcessor; 

Con esto ya les debe funcionar 😃

@Before
public void method()
The Before annotation indicates that this method must be executed before each test in the class, so as to execute some preconditions necessary for the test.
@BeforeClass
public static void method()
The BeforeClass annotation indicates that the static method to which is attached must be executed once and before all tests in the class. That happens when the test methods share computationally expensive setup (e.g. connect to database).

Procesos de los tests:

  1. Preparar objetos
  2. Ejecutar métodos
  3. Comprobar resultados

Seria bueno que mencionaras en que casos se utilizaria el @Before o ante que se sobrepone…

Muchas gracias por destacar las partes de cada prueba instructor Ferran, no sabía que se organizaban de esa manera y ahora con la anotación @Before vamos a poder ordenar mejor aquellos elementos que se repiten entre pruebas.

Genial

Super 😃

¡El curso va muy bien!