3. ➔ JUnit Platform: É o responsável pela descoberta e execução de testes na
JVM, definindo a relação entre os testes e plataforma de execução (IDEs,
console, ferramentas de build). Esse módulo também expõe a interface
TestEngine, que define o contrato de execução de qualquer ferramenta de
testes sobre a plataforma do JUnit.
➔ JUnit Jupiter: Este módulo contém os novos recursos para construção de
testes usando o JUnit, e fornece uma implementação de TestEngine para
execução dos testes escritos com o JUnit Jupiter.
➔ JUnit Vintage: Fornece um TestEngine para execução de testes escritos em
JUnit 3 e 4.
10. import org.junit.jupiter.api.DisplayName;
public class Sample5 {
@Test
@DisplayName("The sum (1 + 1) must be 2")
public void testWithDisplayName() {
assertEquals(2, 1 + 1);
}
@Test
@DisplayName("The sum (1 + 1) must be 2, with emoji 😃!")
public void testWithDisplayName2() {
assertEquals(2, 1 + 1);
}
}
15. class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
16. import static org.junit.jupiter.api.Assertions.assertAll;
public class Sample7 {
@Test
public void sample() {
Person person = new Person("Tiago de Freitas Lima", 20);
assertAll(
() -> assertEquals("Tiago Lima", person.name),
() -> assertEquals(32, person.age));
}
@Test
public void sample2() {
Person person = new Person("Tiago de Freitas Lima", 20);
assertAll("Something is wrong...",
() -> assertEquals("Tiago Lima", person.name),
() -> assertEquals(32, person.age));
}
}
17. Expected :Tiago Lima
Actual :Tiago de Freitas Lima
Expected :32
Actual :20
org.opentest4j.MultipleFailuresError:
Multiple Failures (2 failures)
expected: <Tiago Lima> but was: <Tiago de
Freitas Lima>
expected: <32> but was: <20>
43. ...
@Test
@DisplayName("it is no longer empty")
void isNotEmpty() {
assertFalse(stack.isEmpty());
}
@Test
@DisplayName("returns the element when popped and is empty")
void returnElementWhenPopped() {
assertEquals(anElement, stack.pop());
assertTrue(stack.isEmpty());
}
@Test
@DisplayName("returns the element when peeked but remains not empty")
void returnElementWhenPeeked() {
assertEquals(anElement, stack.peek());
assertFalse(stack.isEmpty());
}
}
}
}
JUnit dividido em projetos com conceitos diferentes: Platform (descoberta e execução de testes), Jupiter (construção de testes), Vintage (compatibilidade com versões anteriores para execução no JUnit Platform)
Explicação geral dos três níveis da arquitetura
JUnit Jupiter = construção de testes. Exemplos a seguir.
Exemplo básico - destacar: o pacote org.junit.jupiter não confilta com as versões anteriores. Classe Assert substituída por Assertions
Uso de meta anotações (anotações marcadas com Test)
BeforeAll - antiga BeforeClass
BeforeEach - antiga Before
AfterAll - antiga AfterClass
AfterEach - antiga After
Comentar sobre isolamento - cada teste em uma instância da classe. Possibilidade de alterar esse comportamento usando @TestInstance
@DisplayName - saída no output
Output no Intelij
JUnit Jupiter = construção de testes. Exemplos a seguir.
Comentar sobre o último parâmetro - mensagem exibida em caso de erro. No segundo exemplo a mensagem é fornecida por um Supplier
Comentar que outros métodos continuam existindo (assertNotEquals, assertSame, assertTrue, etc)
assertAll - encapsula vários asserts em um único teste
Mensagem de erro do assertAll
Testes de exceptions - comentar sobre como são feitos no Junit 4 (parametro expected da anotação Test, rule ExpectedException ou try/catch)
Exemplo básico - destacar: o pacote org.junit.jupiter não confilta com as versões anteriores. Classe Assert substituída por Assertions
assertThrows
O segundo exemplo captura a exception lançada para validação
Testes de timeouts - comentar sobre como são feitos no Junit 4 (parametro timeout da anotação Test, rule Timeout)
Exemplo básico - destacar: o pacote org.junit.jupiter não confilta com as versões anteriores. Classe Assert substituída por Assertions
assertTimeout. Executado na mesma thread
O segundo exemplo captura o retorno do método para validação. O parametro é um ThrowingSupplier
assertTimeoutPreemptively. Executado em outra thread
Testes parametrizados. Explicar a motivação e como são feitos no Junit 4 (array bidimensional com parametros injetados via construtor)
artefato necessário
@ParameterizedTest ao inves de @Test
@ValueSource - parameter provider do teste. Parametros fixos
@EnumSource - teste executado para cada elemento do enum
@MethodSource - método fornecedor de parametros. O retorno deve ser uma Collection, array ou Stream.
Esse exemplo utiliza apenas um parâmetro por teste.
@MethodSource - Esse exemplo utiliza multiplos parâmetro por teste, retornando uma coleção de Arguments
@CvsSource - parâmetros no formato CSV (separados por vírgula)