Estou fazendo um treinamento Java e entramos na parte de testes com o JUnit.
Para esta semana precisamos validar as classes de uma atividade feita no passado mas estou tendo dificuldades em desenvolver estes testes devido a minha inexperiência com programação.
Poderiam me ajudar?
As classes desenvolvidas no passado são:
1 - Pizza:
import java.util.HashMap;
public class Pizza {
public static HashMap<String, Integer> ingredientes = new HashMap<String, Integer>();
public int qtdIngredientes = 0;
public void adicionarIngrediente(String ingrediente) {
contabilizaIngrediente(ingrediente);
this.qtdIngredientes++;
}
public double getPreco() {
if (this.qtdIngredientes <= 2) {
return 15.00;}
if (this.qtdIngredientes >= 3 && this.qtdIngredientes <= 5) {
return 20.00;}
if (this.qtdIngredientes > 5) {
return 23.00;}
return 0.00;
}
public int getQtdIngredientes() {
return this.qtdIngredientes;
}
private static void contabilizaIngrediente(String ingrediente) {
if (ingredientes.containsKey(ingrediente)) {
Integer quantidade = ingredientes.get(ingrediente);
ingredientes.replace(ingrediente, quantidade + 1);
} else {
ingredientes.put(ingrediente, 1);
}
}
}
2 - Carrinho de Compras
import java.util.HashMap;
public class CarrinhoDeCompras {
HashMap<Integer, Pizza> items = new HashMap<>();
public void adicionarItem(Pizza pizza) {
if (pizza.getQtdIngredientes() == 0) {
throw new IllegalArgumentException("A pizza nao possui ingredientes, por favor escolha seu sabor.");
}
items.put(items.size() + 1, pizza);
}
public int getPrecoTotal() {
int precoTotal = 0;
for (int i = 1; i <= items.size(); i++) {
Pizza pizza = items.get(i);
precoTotal += pizza.getPreco();
}
return precoTotal;
}
}
3 - Principal
import java.util.Map;
public class Principal {
public static void main(String[] args) {
Pizza p1 = new Pizza();
p1.adicionarIngrediente("Mussarela");
p1.adicionarIngrediente("Chocolate");
p1.adicionarIngrediente("Presento");
Pizza p2 = new Pizza();
p2.adicionarIngrediente("Mussarela");
p2.adicionarIngrediente("Calabresa");
Pizza p3 = new Pizza();
p3.adicionarIngrediente("Mussarela");
p3.adicionarIngrediente("Milho");
p3.adicionarIngrediente("Portuguesa");
p3.adicionarIngrediente("Chocolate");
CarrinhoDeCompras carrinhoDeCompras = new CarrinhoDeCompras();
try{
carrinhoDeCompras.adicionarItem(p1);
carrinhoDeCompras.adicionarItem(p2);
carrinhoDeCompras.adicionarItem(p3);
} catch (Exception erro) {
System.out.println(erro.getMessage());
}
System.out.println("Pizza 1");
System.out.println("* Preco: R$" + p1.getPreco());
System.out.println("* Quantidade de Ingredientes: " + p1.getQtdIngredientes());
System.out.println();
System.out.println("Pizza 2");
System.out.println("* Preco: R$" + p2.getPreco());
System.out.println("* Quantidade de Ingredientes: " + p2.getQtdIngredientes());
System.out.println();
System.out.println("Pizza 3");
System.out.println("* Preco: R$" + p3.getPreco());
System.out.println("* Quantidade de Ingredientes: " + p3.getQtdIngredientes());
System.out.println();
System.out.println("* Valor Total da Compra: R$" + carrinhoDeCompras.getPrecoTotal()+".00");
System.out.println();
System.out.println("Ingredientes Utilizados");
for (Map.Entry<String, Integer> pizza : Pizza.ingredientes.entrySet()) {
System.out.println("x" + pizza.getValue() + " " + pizza.getKey());
}
}
}
Na atividade desta semana, precisamos fazer a seguinte tarefa:
Faça os testes de unidade da classe Pizza e verifique se o valor da Pizza está correto de acordo com a quantidade de ingredientes. Verifique também se o registro de ingredientes funcionou corretamente. Crie um método estático na classe Pizza que zera o registro de ingredientes e invoque ele em um método de inicialização ou finalização na classe de testes. Um método de teste deve ser independente do que aconteceu em outros métodos de teste!
Faça os testes da classe CarrinhoDeCompras, verificando se o preço das pizzas são somados corretamente e se ele impede a adição de uma pizza sem ingredientes.
Procure criar os testes de forma que cada método de testes verifique um cenário e uma funcionalidade. Evite por exemplo, em um mesmo teste, verificar o preço da pizza e o registro de ingredientes ao mesmo tempo.
Até o momento eu comecei a desenvolver a classe TestePizzaria conforme abaixo:
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestePizzaria {
@Before
public void before(){
System.out.println("@Before");
}
@After
public void after(){
System.out.println("@After");
}
@BeforeClass
public static void beforeClass(){
System.out.println("@BeforeClass");
}
@AfterClass
public static void afterClass(){
System.out.println("@AfterClass");
}
@Test
public void testePizza1() {
Pizza p1 = new Pizza();
p1.adicionarIngrediente(null);
p1.adicionarIngrediente(null);
p1.adicionarIngrediente(null);
assertEquals(3, p1.getQtdIngredientes());
}
@Test
public void testePizza2() {
Pizza p2 = new Pizza();
p2.adicionarIngrediente(null);
p2.adicionarIngrediente(null);
assertEquals(2, p2.getQtdIngredientes());
}
}
Podem me ajudar como modelar o resto do que é solicitado na atividade de teste?