1 of 26

[1]

Programação Orientada

a Objetos com Java e JUnit 5

Camila Cavalcante

Tech Education Coordinator�DIO

linkedin.com/in/cami-lagithub.com/cami-lainstagram.com/camimi_la

2 of 26

[2]

Conheça os principais conceitos do Paradigma de Programação Orientada a Objetos. Nesse contexto, explore a linguagem de programação Java e TypeScript, resolvendo alguns exercícios e entenda como testar as funcionalidades da sua aplicação com JUnit5.

Objetivo Geral

3 of 26

[3]

  • Java JDK 8+ (Usarei JDK 17)
  • IDE para desenvolvimento Java (Usarei IntelliJ Community)
  • O básico sobre Git e GitHub*
  • Sintaxe básica Java

Pré-Requisitos

4 of 26

[4]

// Programação Orientada a Objetos com Java

Parte 1

Programação Orientada a Objetos com Java

5 of 26

[5]

Modelo de análise, projeto e programação baseado na aproximação entre o mundo real e o mundo virtual, através da criação e interação entre classes, atributos, métodos, objetos, entre outros.

PPOO

6 of 26

[6]

Classe X Objeto

Classe

Objeto

7 of 26

[7]

Conceitos Fundamentais POO

8 of 26

[8]

Habilidade de concentrar-se nos aspectos essenciais de um domínio, ignorando características menos importantes ou acidentais.

Nesse contexto, objetos são abstrações de entidades existentes no domínio em questão.

Abstração

9 of 26

[9]

Permite que objetos sejam referenciados como pai e filhos, em que os objetos filhos herdam todas as características do objeto pai, mas o objeto pai nada herda do filho. Isso reduz a duplicação de código-fonte.

Herança

10 of 26

[10]

Encapsular significa esconder a implementação dos objetos. O encapsulamento favorece principalmente dois aspectos de um sistema: a manutenção e a evolução.

Encapsulamento

11 of 26

[11]

Busca representar as relações que os objetos devem ter, baseando-se nas relações que existem na vida real. Isso faz com que os objetos sejam reaproveitados, evitando duplicidade e mantendo a simplicidade.

Composição

12 of 26

[12]

Com o polimorfismo, podemos transformar objetos diferentes em objetos que conseguem trocar mensagens por meio da generalização de suas características.

Polimorfismo

13 of 26

[13]

“Falar é fácil.

 Mostre-me o código!

Linus Torvalds

Hands On!

14 of 26

[14]

Parte 2

Testes unitários com JUnit 5

// Programação Orientada a Objetos com Java e JUnit 5

15 of 26

[15]

  • O software deve fazer o que o cliente precisa de maneira confiável, segura, eficiente e flexível.
  • Para um software ser testado corretamente, esse processo deve ser automatizado com o auxílio de ferramentas com esta finalidade.
  • Os testes automatizados vêm como uma forma de poupar tempo de detecção de erros e de aumento de confiabilidade com relação aos testes em si.

Por que testamos?

16 of 26

[16]

Pirâmide de Testes

17 of 26

[17]

  • São testes que verificam se uma parte específica do código, costumeiramente a nível de função, está funcionando corretamente. 
  • Estes tipos de testes são frequentemente escritos por desenvolvedores quando trabalham no código, para assegurar que a função específica está executando como esperado. 
  • Testes Unitários não dependem de nenhum processo ou sistema externo (banco de dados, console, rede e etc.)

Testes Unitários

18 of 26

[18]

  • Para efetuar os testes automatizados precisamos de um framework auxiliar de testes unitários e assim efetuar as operações de lógica de negócio na camada do servidor.
  • O JUnit é um framework open-source e tem como objetivo facilitar a criação de casos de teste, além de permitir escrever testes que retenham seu valor ao longo do tempo.
  • A maioria das IDEs do mercado incorporam o JUnit dentro de seu ambiente de desenvolvimento, facilitando assim o uso desse framework.

19 of 26

[19]

JUnit Platform + JUnit Jupiter + JUnit Vintage​

  • JUnit Platform: Serve como base para lançar estruturas de teste na JVM. Ele também define a API TestEngine para desenvolver uma estrutura de teste que é executada na plataforma.​
  • Junit Jupiter: O subprojeto Jupiter fornece um TestEngine para executar testes baseados em Jupiter na plataforma.​
  • Junit Vintage: Fornece um TestEngine para executar testes baseados em JUnit 3 e JUnit 4 na plataforma.​

20 of 26

[20]

21 of 26

[21]

Assertions é uma coleção de métodos utilitários que suportam a afirmação de condições em testes.​

Detalhe de alguns métodos:​

  • assertTrue: Afirma que a condição é verdadeira.​
  • assertNull: Afirma que o valor atual é nulo.​
  • assertEquals: Afirma que o esperado e o real são iguais.​
  • assertSame: Afirma que o esperado o atual referem-se ao mesmo objeto.​
  • assertThrows: Afirma que a execução fornecida lança uma exceção.​

22 of 26

[22]

Assumptions é uma coleção de métodos utilitários que suportam a execução de testes condicionais com base em suposições.​

Detalhe de alguns métodos:​

  • assumeTrue: Validação da suposição dada.​
  • assumeFalse: Validação da suposição dada.​
  • assumingThat: Execute o executável fornecido, mas somente se a suposição fornecida for válida.​

23 of 26

[23]

Os testes parametrizados normalmente consomem argumentos diretamente da fonte configurada seguindo uma correlação de um para um entre o índice da fonte do argumento e o índice do parâmetro do método, precedido do @ParameterizedTest.​

Algumas fontes de argumentos:​

  • ​@ValueSource​
  • @EnumSource​
  • @MethodSource​
  • @CsvSource​
  • @ArgumentSource

24 of 26

[24]

  • Embora os recursos de assertions fornecidos pelo JUnit Jupiter sejam suficientes para muitos cenários de teste, há momentos em que mais potência e funcionalidades adicionais, como matchers, são desejadas ou necessárias.​
  • Nesses casos, a equipe do JUnit recomenda o uso de bibliotecas de asserções de terceiros, como AssertJ, Hamcrest, Truth, etc.​
  • Os desenvolvedores são, portanto, livres para usar a biblioteca de asserções de sua escolha.​

25 of 26

[25]

26 of 26

[26]

“Falar é fácil.

 Mostre-me o código!

Linus Torvalds

Hands On!