Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Teste de imutabilidade

Como fazer o teste de mutabilidade sugerido na resposta ? Com o mutability detector ?

6 respostas

Oi Leonardo, tudo bem?

A ideia é você tentar alterar a referencia e ver se persistiu a imutabilidade.

Só não entendi muito bem como tentar alterar, já que em uma classe imutável não teremos setters - dessa forma não poderíamos escrever testes chamando setters, pois já daria erro de compilação.

Se o teste for chamando outros métodos também não seria um teste completo, pois estaria garantindo apenas que esses métodos não alteram o conteúdo da classe - e nada impediria de alguém criar novos métodos que alteram a classe, sem que os testes de mutabilidade detectassem isso (pois só testam os métodos conhecidos até então).

Por isso pensei que a sugestão do instrutor, quando falou em implementar testes de mutabilidade, se referia ao Mutability Detector (https://gualtierotesta.wordpress.com/2017/01/01/unit-testing-java-data-classes-immutability-with-the-mutability-detector/).

Se não for isso, teria algum exemplo de teste de mutabilidade para esclarecer melhor ?

Obrigado

solução

Leonardo,

Pensa nesse caso :

public final class Acao{
    private final Calendar data;
    private final BigDecimal valor;
    private final Empresa empresa;
}

Agora no seu teste você teria que garantir que suas propriedades são imutáveis. Por exemplo a data, você não pode alterar nenhum valor, caso contrário seu objeto Acao deixa de ser imutável.

Ai você teria que validar se de fato a referencia não está sendo alterada

Você diz que, como Calendar é mutável, se tiver um getData devo retornar uma cópia defensiva, e o teste seria para confirmar que ao alterar o objeto retornado pelo getData não altero a data original, ou sej, que estou alterando apenas uma cópia ?

Exatamente !

Você precisa garantir que seu objeto não sofre alterações

Olá, Leonardo. Só complementando a explicação, mesmo que você não crie setters se a classe não é "final" ela pode ser estendida e os valores alterados por sobreposição.