Spring + Testing

  1. Configuração do Maven:
  2. Estrutura de diretórios:
  3. Criação de testes:

JUnit - Testes de Unidade

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class CalculadoraTest {

	@Test
  @DisplayName("Testando soma")
	public void testSoma() {
	    // Arrange (preparação)
	    Calculadora calculadora = new Calculadora();
	
	    // Act (ação)
	    int resultado = calculadora.soma(2, 3);
	
	    // Assert (verificação)
	    assertEquals(5, resultado);
	}
	
	@Test
	public void testSubtracao() {
	    // Arrange
	    Calculadora calculadora = new Calculadora();
	
	    // Act
	    int resultado = calculadora.subtracao(5, 2);
	
	    // Assert
	    assertEquals(3, resultado);
	}

	@Disabled("Esperando resolverem o bug que 3 é diferente de 1")
	@Test
	public void testNaoSeiOq(){
		  assertEquals(3,1);
  }
}

Assertions

// Padrão: 
assertEquals(2, calculadora.soma(1, 1));
assertEquals(4, calculadora.multiplica(2, 2), "The optional failure message is now the last parameter");
assertTrue('a' < 'b');
// Exceptions
Exception exception = assertThrows(Aritmetica.class, () -> calculadora.divide(1, 0));
assertEquals("/ por zero", exception.getMessage()); // opcional

Existem também bibliotecas focadas em gerar assertions mais legíveis/fluentes, como AssertJ e Hamcrest, podemos usa-las em conjunto com JUnit:

import static org.assertj.core.api.Assertions.*;
assertThat(frodo.getName()).isEqualTo("Frodo");
assertThat(frodo).isNotEqualTo(sauron);
assertThat(fellowshipOfTheRing).hasSize(9)
                               .contains(frodo, sam)
                               .doesNotContain(sauron);

Testes Parametrizados

Testes parametrizados permitem a execução do “mesmo teste”, mas com inputs diferentes, com bem mais facilidade do que criar testes separados:

import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Arrays;
import java.util.Collection;
import static org.junit.Assert.assertEquals;

public class CalculadoraTest {

    @ParameterizedTest
	  @CsvSource({"2, 3, 5",
								"5, 2, 3",
								"0, 0, 0",
								"-1, 1, 0"})
    public void testSoma(int inputA, int inputB, int expectedResult) {
       // Arrange
        Calculadora calculadora = new Calculadora();
        // Act
        int resultado = calculadora.soma(inputA, inputB);
        // Assert
        assertEquals(expectedResult, resultado);
    }
}

Note que passamos os valores usando @CsvSource, mas não é a única maneira

@ValueSource