2
respostas

[Dúvida] Test Junit com a Class BigDecimal

Classe Funcionário

public class Funcionario {

    private String nome;
    private LocalDate dataAdmissao;
    private BigDecimal salario;

    public Funcionario(String nome, LocalDate dataAdmissao, BigDecimal salario) {
        this.nome = nome;
        this.dataAdmissao = dataAdmissao;
        this.salario = salario.setScale(2, RoundingMode.HALF_UP);
    }

    public String getNome() {
        return nome;
    }

    public LocalDate getDataAdmissao() {
        return dataAdmissao;
    }

    public BigDecimal getSalario() {
        return salario;
    }
}

Classe BonusService

public class BonusService {

    public BigDecimal calcularBonus(Funcionario funcionario) {
        BigDecimal valor = funcionario.getSalario().multiply(new BigDecimal("0.1"));
        if (valor.compareTo(new BigDecimal("1000")) > 0) {
            valor = BigDecimal.ZERO;
        }
        return valor;
    }
}

Classe BonusServiceTest

class BonusServiceTest {

    @Test
    void bonusZero() {
        Funcionario funcionario = new Funcionario("Luccas", LocalDate.now(), new BigDecimal(1000));
        BonusService service = new BonusService();
        BigDecimal bonus = service.calcularBonus(funcionario);
        System.out.println(bonus);
        System.out.println(funcionario.getSalario());
        assertEquals(BigDecimal.ZERO, bonus);
    }
}

Quando rodo o test em algumas situaçoes o bonus vem com 3 casas decimais pq?? e o getSalario vem com 2 em todas que eu fiz

2 respostas

Oi, Luccas! Tudo bem?

Isso ocorre porque o BigDecimal pode, em certas operações, gerar valores com mais casas decimais do que o esperado, o que ocorre no cálculo do bônus. Dessa forma, para garantir que o bônus tenha sempre duas casas decimais, podemos ajustar o método calcularBonus na classe BonusService para definir a escala do valor calculado, da seguinte maneira:

public class BonusService {
    public BigDecimal calcularBonus(Funcionario funcionario) {
        BigDecimal valor = funcionario.getSalario().multiply(new BigDecimal("0.1"));
        if (valor.compareTo(new BigDecimal("1000")) > 0) {
            valor = BigDecimal.ZERO;
        }
        return valor.setScale(2, RoundingMode.HALF_UP);
    }
}

Com essa alteração, o valor do bônus será sempre arredondado para duas casas decimais, utilizando o RoundingMode.HALF_UP.

Espero ter ajudado!

Um forte abraço e bons estudos!

pq não usa o double ao inves do BigDecimal? qual a vantagem dele? e qual a diferença entre eu passar new BigDecimal("0.1") e new BigDecimal(0.1)?