Testes Unitários com JUnit
Tags: beginners, junit, java, portugues
Published: 2021-06-16 12:27:10

Testes são extremamente necessários em qualquer aplicação para garantir sua funcionalidade durante seu desenvolvimento. Esses testes devem ser feitos de forma simples e rápida, para que possam ser executados várias vezes sem levar muito tempo. Além disso, devem ser independentes, ou seja, um teste não deve afetar o outro. E também, deve ser possível repeti-los sempre que for preciso.
Estes testes devem abranger todos os cenários possíveis que a aplicação será usada.

Por exemplo, sua aplicação oferece um serviço de locação de filmes. Seus testes devem simular este serviço em diversas situações diferentes, ou seja, com diferentes quantidades de produtos, preços diferentes e etc.

Agora vamos falar um pouco sobre o JUnit, que é a principal ferramenta para a execução de testes unitários.

JUnit é um framework extremamente importante, pois, com ele, podemos criar testes para verificar funcionalidades de classes e seus métodos. Além disso, ele é responsável por automatizar a execução destes testes. Desta maneira, sempre que houver alguma alteração no código, os testes serão executados para garantir a integridade da aplicação.

### Exemplo:

Criei um código simples de um serviço de locação de filmes, e quero realizar um teste.

Três entidades foram criadas: Filme, Locacao, e Usuario.

LocacaoService:
```
	public Locacao alugarFilme(Usuario usuario, List<Filme> filmes) 
			throws FilmeSemEstoqueException, LocadoraException {
		if(usuario == null) {
			throw new LocadoraException("Usuario vazio");
		}
		
		if(filmes == null || filmes.isEmpty()) {
			throw new LocadoraException("Filme vazio");
		}

		for (Filme filme: filmes) {
			if (filme.getEstoque() == 0) {
				throw new FilmeSemEstoqueException();
			}
		}
		
		Locacao locacao = new Locacao();
		locacao.setFilmes(filmes);
		locacao.setUsuario(usuario);
		locacao.setDataLocacao(new Date());
		Double valorTotal = 0d;
		for (Filme filme:filmes){
			valorTotal += filme.getPrecoLocacao();
		}
		locacao.setValor(valorTotal);
		
		//Entrega no dia seguinte
		Date dataEntrega = new Date();
		dataEntrega = adicionarDias(dataEntrega, 1);
		locacao.setDataRetorno(dataEntrega);
		
		return locacao;
	}

```

#### Agora com as entidades e os serviços criados podemos fazer os testes.
```
@Test
public void testeLocacao() throws Exception {
	//given
	Usuario usuario = new Usuario("Usuario 1");
	List<Filme> filmes = Arrays.asList(new Filme("Filme 1", 1, 5.0));

	//when
	Locacao locacao = service.alugarFilme(usuario, filmes);

	//then
	error.checkThat(locacao.getValor(), is(equalTo(5.0)));
	error.checkThat(isMesmaData(locacao.getDataLocacao(), new Date()), is(true));
	error.checkThat(isMesmaData(locacao.getDataRetorno(), obterDataComDiferencaDias(1)), is(true));
}
```

Primeiro nós devemos criar o cenário do teste, iniciando as entidades e dando a elas um valor, chamamos isso de "Given".

```
Usuario usuario = new Usuario("Usuario 1");
List<Filme> filmes = Arrays.asList(new Filme("Filme 1", 1, 5.0));
```

Com o cenário criado faremos a ação que desejamos testar, neste caso, alugar um filme, chamamos isso de "When".

```
Locacao locacao = service.alugarFilme(usuario, filmes);
```

Por fim, é necessário verificar se tudo está do jeito certo, chamamos isso de "Then".

```
error.checkThat(locacao.getValor(), is(equalTo(5.0)));
error.checkThat(isMesmaData(locacao.getDataLocacao(), new Date()), is(true));
error.checkThat(isMesmaData(locacao.getDataRetorno(),obterDataComDiferencaDias(1)), is(true));
```

###Conclusão

Com isso é possível criar testes em diversos cenários  e ter certeza que sua aplicação não ira quebrar caso haja algum tipo de alteração no código.

Caso esteja interessado, o código está no [GitHub](https://github.com/pedro-henrique-arruzzo/poc/tree/main/UnitTests)