Como fazer o teste de mutabilidade sugerido na resposta ? Com o mutability detector ?
Como fazer o teste de mutabilidade sugerido na resposta ? Com o mutability detector ?
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
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.