Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modulo 4 - Stub, Mock e Spy #2

Open
wants to merge 77 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
a621a88
Configurando ambiente, edicionado Dependências para JUnit 5.4.0
leco123 Nov 24, 2023
0407c99
2.2 Escrevendo meu primeiro teste unitário
leco123 Nov 24, 2023
0936498
2.3. Explorando as asserções
leco123 Nov 24, 2023
95b5e33
2.3. Explorando as asserções: adicionando mensagem personalizada.
leco123 Nov 24, 2023
12dfeda
2.3. Explorando as asserções: adicionando mensagem personalizada.
leco123 Nov 24, 2023
8255211
2.3. Explorando as asserções: adicionando mensagem personalizada.
leco123 Nov 24, 2023
644247e
2.4. Asserções de Exceptions
leco123 Nov 24, 2023
ae4ffeb
2.4. Asserções de Exceptions=>[FAZER FALHAR]
leco123 Nov 24, 2023
f33d8cd
2.4. Asserções de Exceptions=>[FAZER PASSAR]
leco123 Nov 24, 2023
d7b7a88
2.4. Asserções de Exceptions=>[FAZER FALHAR]
leco123 Nov 24, 2023
2b56d9a
2.4. Asserções de Exceptions=>[FAZER PASSAR]
leco123 Nov 24, 2023
fd90773
2.4. Asserções de Exceptions: Comparar Mensagem passada, agora método…
leco123 Nov 24, 2023
e0de01f
2.4. Asserções de Exceptions:
leco123 Nov 24, 2023
1f47e1c
2.5. Asserções em listas: Exemplo com [erro].
leco123 Nov 24, 2023
9f7bf6f
2.5. Asserções em listas: Exemplo com [certo].
leco123 Nov 24, 2023
4fe256f
2.5. Asserções em listas: AssertArrayEquals
leco123 Nov 24, 2023
769bfff
2.6. Asserções de Timeout, é utilizado em métodos que demoram em sua …
leco123 Nov 24, 2023
ef3da1a
2.6. Asserções de Timeout, é utilizado em métodos que demoram em sua …
leco123 Nov 24, 2023
877c5e8
2.7. Asserções agrupadas com AssertAll: [Exemplo lançando erro]
leco123 Nov 24, 2023
cf23cd0
2.7. Asserções agrupadas com AssertAll: [Exemplo correto]
leco123 Nov 24, 2023
94c9bd8
2.7. Asserções agrupadas com AssertAll:
leco123 Nov 24, 2023
0e0764e
atualizando classe PessoaTest
leco123 Nov 24, 2023
44cad1f
2.9. Desabilitando testes unitários
leco123 Nov 24, 2023
d8c60e2
2.10. Ignorando execução dos testes condicionalmente com Assumptions …
leco123 Nov 24, 2023
b93c180
2.10. Ignorando execução dos testes condicionalmente com Assumptions …
leco123 Nov 24, 2023
1c338ea
2.11. Executando testes via Maven: adicionando plugin pom.xml para ex…
leco123 Nov 24, 2023
823b7be
2.11. ajustes na nomenclatura não aceita acentuação.
leco123 Nov 24, 2023
a90dc1d
2.11. Executando testes via Maven:
leco123 Nov 24, 2023
a631092
2.12. Desafio - Escrevendo testes faltantes do SaudacaoUtil, como imp…
leco123 Nov 24, 2023
069dc96
ajustar importes
leco123 Nov 24, 2023
f3baded
2.13. Refatorando classe SaudacaoUtil
leco123 Nov 27, 2023
23565b1
2.13. Refatorando classe SaudacaoUtil
leco123 Nov 28, 2023
3a3aecd
2.13. Refatorando classe SaudacaoUtil
leco123 Nov 28, 2023
6b12f06
2.13. Refatorando classe SaudacaoUtil
leco123 Nov 28, 2023
b1961eb
2.13. Refatorando classe SaudacaoUtil
leco123 Nov 28, 2023
36ed50b
3.1. Organizando testes com o padrão Triple A: apenas adicionando com…
leco123 Nov 28, 2023
76e3163
3.1. Organizando testes com o padrão Triple A
leco123 Nov 28, 2023
7f6b2cf
3.2. Alterando nome de exibição dos testes com @DisplayName, tanto na…
leco123 Nov 28, 2023
644dedf
3.3. Formatando nomes de testes com @DisplayNameGeneration
leco123 Nov 28, 2023
cc8e8f8
3.4. Aplicando a nomenclatura do BDD para nomear métodos de teste
leco123 Nov 28, 2023
cf83f29
3.5. Organizando classe de testes com sub-classes e @Nested
leco123 Nov 28, 2023
e50f51b
3.6. Preparando o cenário de testes com @BeforeEach e @BeforeAll, usa…
leco123 Nov 28, 2023
57352c5
3.6. Preparando o cenário de testes com @BeforeEach e @BeforeAll, usa…
leco123 Nov 28, 2023
d92ee1a
3.7. Um teste deve ter uma única asserção?
leco123 Nov 29, 2023
429e92b
3.8. Combinando @Nested e @BeforeEach com a nomenclatura do BDD
leco123 Nov 29, 2023
8708f06
3.8. Combinando @Nested e @BeforeEach com a nomenclatura do BDD
leco123 Nov 29, 2023
6d84bb0
3.9. Desafio - Implemente a lógica e testes de um carrinho de compras:
leco123 Nov 29, 2023
fb9f890
3.9. Desafio - Implemente a lógica e testes de um carrinho de compras:
leco123 Nov 29, 2023
14eb8a2
3.9. Desafio - Implemente a lógica e testes de um carrinho de compras:
leco123 Nov 29, 2023
a6c0516
3.9. Desafio - Arquivo com resolução.
leco123 Dec 1, 2023
f13ecd1
Merge pull request #1 from leco123/MODULO-3
leco123 Dec 1, 2023
15f1130
3.9. Desafio - Arquivo com resolução.
leco123 Dec 8, 2023
461dec2
3.9. Desafio - Arquivo com resolução.
leco123 Dec 8, 2023
1b4d2dd
Merge pull request #2 from leco123/MODULO-3
leco123 Dec 9, 2023
c236cbc
MÓDULO-4: Stub, Mock e Spy
leco123 Dec 9, 2023
e38b73c
4.1. Implementações falsas com Stub
leco123 Dec 9, 2023
673fd04
4.2. Introdução ao Mock + 4.3. Simulando classes com Mockito
leco123 Dec 14, 2023
8c4d6bd
4.2. Introdução ao Mock + 4.3. Simulando classes com Mockito
leco123 Dec 14, 2023
9b532fb
4.2. Introdução ao Mock + 4.3. Simulando classes com Mockito
leco123 Dec 14, 2023
68cfab3
4.2. Introdução ao Mock + 4.3. Simulando classes com Mockito
leco123 Dec 14, 2023
9410636
4.4. Mock usando annotations
leco123 Dec 14, 2023
63f39ac
4.5. Alterando estado dos parâmetros passados no mock
leco123 Dec 14, 2023
5c1b46a
4.6. Parâmetros dinâmicos
leco123 Dec 20, 2023
134fef3
4.7. Verificando chamada de métodos com mock usando Mockito verify
leco123 Dec 20, 2023
f50d504
4.7. Verificando chamada de métodos com mock usando Mockito verify
leco123 Dec 20, 2023
900a59a
4.8. Forçando uma Exception com mock
leco123 Dec 20, 2023
20368c5
4.8. Forçando uma Exception com mock
leco123 Dec 21, 2023
45df9bb
4.8. Forçando uma Exception com mock
leco123 Jan 17, 2024
48d9571
4.9. Capturando parâmetros enviados aos mocks com Argument Captor
leco123 Jan 17, 2024
af7d21c
4.10. Espionando um objeto real com Mockito
leco123 Jan 17, 2024
39688a4
4.11. Alterando retorno de um mock após chamadas consecutivas
leco123 Jan 17, 2024
8d82194
4.11. Alterando retorno de um mock após chamadas consecutivas
leco123 Jan 17, 2024
b2c922c
4.12. Verificando ordem de chamada de métodos
leco123 Jan 17, 2024
d8ee13c
4.13. Usando mock em métodos estáticos
leco123 Jan 19, 2024
616f4c8
4.14. Entendendo problema de mocks não utilizados
leco123 Jan 21, 2024
76ee00c
4.15. Implementando testes no CadastroEditor no método de edição
leco123 Jan 21, 2024
f814f81
4.16. Desafio - Criar testes do CadastroPost
leco123 Jan 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,39 @@
<maven.compiler.source>17</maven.compiler.source>
</properties>
<dependencies>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>2.23.4</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<plugins>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
Expand All @@ -35,6 +59,12 @@
</archive>
</configuration>
</plugin>
<!-- puglin usado para executar testes via terminarl -->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>

</plugins>
</build>

Expand Down
63 changes: 60 additions & 3 deletions src/main/java/com/algaworks/junit/ecommerce/CarrinhoCompra.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,50 +24,106 @@ public CarrinhoCompra(Cliente cliente, List<ItemCarrinhoCompra> itens) {

public List<ItemCarrinhoCompra> getItens() {
//TODO deve retornar uma nova lista para que a antiga não seja alterada
return null;
return new ArrayList<>(itens);
}

public Cliente getCliente() {
return cliente;
}

public void adicionarProduto(Produto produto, int quantidade) {

//TODO parâmetros não podem ser nulos, deve retornar uma exception
Objects.requireNonNull(produto);

//TODO quantidade não pode ser menor que 1
validaQuantidade(quantidade);

//TODO deve incrementar a quantidade caso o produto já exista
encontrarItemPeloProduto(produto)
.ifPresentOrElse(item -> item.adicionarQuantidade(quantidade), ()-> adicionarNovoItem(produto, quantidade));
}

public void removerProduto(Produto produto) {

//TODO parâmetro não pode ser nulo, deve retornar uma exception
Objects.requireNonNull(produto);

//TODO caso o produto não exista, deve retornar uma exception
ItemCarrinhoCompra item = encontrarItemPeloProduto(produto).orElseThrow(RuntimeException::new);

//TODO deve remover o produto independente da quantidade
this.itens.remove(item);

}

public void aumentarQuantidadeProduto(Produto produto) {

//TODO parâmetro não pode ser nulo, deve retornar uma exception
Objects.requireNonNull(produto);

//TODO caso o produto não exista, deve retornar uma exception
ItemCarrinhoCompra item = encontrarItemPeloProduto(produto).orElseThrow(RuntimeException::new);

//TODO deve aumentar em um quantidade do produto
item.adicionarQuantidade(1);
}

public void diminuirQuantidadeProduto(Produto produto) {

//TODO parâmetro não pode ser nulo, deve retornar uma exception
Objects.requireNonNull(produto);

//TODO caso o produto não exista, deve retornar uma exception
ItemCarrinhoCompra item = encontrarItemPeloProduto(produto).orElseThrow(RuntimeException::new);

//TODO deve diminuir em um quantidade do produto, caso tenha apenas um produto, deve remover da lista
if (item.getQuantidade() == 1) {
itens.remove(item);
} else {
item.subtrairQuantidade(1);
}

}

public BigDecimal getValorTotal() {

//TODO implementar soma do valor total de todos itens
return null;
return this.itens.stream()
.map(ItemCarrinhoCompra::getValorTotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}

public int getQuantidadeTotalDeProdutos() {

//TODO retorna quantidade total de itens no carrinho
//TODO Exemplo em um carrinho com 2 itens, com a quantidade 2 e 3 para cada item respectivamente, deve retornar 5
return 0;
return this.itens.stream()
.map(ItemCarrinhoCompra::getQuantidade)
.reduce(0, Integer::sum);
}

public void esvaziar() {

//TODO deve remover todos os itens
this.itens.clear();
}

private void validaQuantidade(int quantidade) {
if (quantidade <= 0) {
throw new IllegalArgumentException();
}
}

private void adicionarNovoItem(Produto produto, int quantidade) {
this.itens.add(new ItemCarrinhoCompra(produto, quantidade));
}

private Optional<ItemCarrinhoCompra> encontrarItemPeloProduto(Produto produto) {
return this.itens
.stream()
.filter(item -> item.getProduto().equals(produto))
.findFirst();
}

@Override
Expand All @@ -82,4 +138,5 @@ public boolean equals(Object o) {
public int hashCode() {
return Objects.hash(itens, cliente);
}

}
28 changes: 26 additions & 2 deletions src/main/java/com/algaworks/junit/utilidade/ContaBancaria.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,48 @@

public class ContaBancaria {

public ContaBancaria(BigDecimal saldo) {
private BigDecimal saldo;

public ContaBancaria(BigDecimal saldoInicial) {

//TODO 1 - validar saldo: não pode ser nulo, caso seja, deve lançar uma IllegalArgumentException
if (saldoInicial == null) {
throw new IllegalArgumentException("Valor inválido");
}

//TODO 2 - pode ser zero ou negativo
this.saldo = saldoInicial;
}

public void saque(BigDecimal valor) {

//TODO 1 - validar valor: não pode ser nulo, zero ou menor que zero, caso seja, deve lançar uma IllegalArgumentException
if (valor == null || valor.compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("Valor inválido");
}

//TODO 2 - Deve subtrair o valor do saldo
if (this.saldo.compareTo(valor) < 0) {
throw new RuntimeException("Saldo insuficiente");
}

//TODO 3 - Se o saldo for insuficiente deve lançar uma RuntimeException
this.saldo = this.saldo.subtract(valor);
}

public void deposito(BigDecimal valor) {

//TODO 1 - validar valor: não pode ser nulo, zero ou menor que zero, caso seja, deve lançar uma IllegalArgumentException
if (valor == null || valor.compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("Valor inválido");
}

//TODO 2 - Deve adicionar o valor ao saldo
this.saldo = this.saldo.add(valor);
}

public BigDecimal saldo() {
//TODO 1 - retornar saldo
return null;
return this.saldo;
}
}
6 changes: 3 additions & 3 deletions src/main/java/com/algaworks/junit/utilidade/SaudacaoUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ private SaudacaoUtil() {
}

public static String saudar(int hora) {
if (hora >= 0 && hora <= 11) {
if (hora >= 5 && hora <= 11) {
return "Bom dia";
} else if(hora >= 12 && hora <= 17) {
return "Boa tarde";
} else if(hora >= 18 && hora <= 23) {
} else if(hora >= 18 && hora <= 23 || hora >= 0 && hora < 5) {
return "Boa noite";
}
throw new IllegalArgumentException("Hora inválida");
throw new IllegalArgumentException("Hora invalida");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.algaworks.junit.blog.negocio;

import com.algaworks.junit.blog.armazenamento.ArmazenamentoEditor;
import com.algaworks.junit.blog.modelo.Editor;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

public class ArmazenamentoEditorFixoEmMemoria implements ArmazenamentoEditor {

public boolean chamouSalvar;

@Override
public Editor salvar(Editor editor) {
this.chamouSalvar = true;
if (editor.getId() == null) {
editor.setId(1L);
}
return editor;
}

@Override
public Optional<Editor> encontrarPorId(Long editor) {
return Optional.empty();
}

@Override
public Optional<Editor> encontrarPorEmail(String email) {
if (email.equals("[email protected]")) {
return Optional.of(new Editor(2L, "Alex", "[email protected]", BigDecimal.TEN, true));
}
return Optional.empty();
}

@Override
public Optional<Editor> encontrarPorEmailComIdDiferenteDe(String email, Long id) {
return Optional.empty();
}

@Override
public void remover(Long editorId) {

}

@Override
public List<Editor> encontrarTodos() {
return null;
}
}
Loading