Olá pessoal, não entendi muito bem o conceito do AssertionError, aliás não consigo exergar um cenário para usar asserts, alguem pode me dar um ideia melhor de como funciona? Obrigado!
Quando você tem uma sentença e já supõe o resultado dela com certeza, você tem faz uma asserção (afirmação) sobre esta sentença. Exemplos:
- o automóvel de passeio tem rodas;
- o mar é composto por água salgada;
- a galinha tem pena;
- o Brasil fica na América Latina.
Ou seja, estas suposições são verdadeiras, você não precisa testar se utilizasse algumas delas em seu código internamente ou ainda se provesse interface para outro sistema inputar dados. Pois o programador deve no mínimo seguir as afirmativas.
Agora num exemplo prático, você tem um parâmetro (ou variável) no seu sistema cujo resultado você já conhece e todo mundo que utiliza e integra com o sistema não pode mudar o valor daquele porque geraria uma incoerência, logo você não precisa de IF para testar isso.
No mundo real de sistemas nem sempre as coisas funcionam assim, algum programador pode alterar o sistema e acabar com a coerência de um valor de modo a gerar um bug difícil de entender. Numa situação corriqueira, você colocaria IFs para testar uma série de variáveis ou parâmetros no sistema até encontrar o problema. Isso é péssimo porque após achar o problema, você poderia esquecer de retirar todos os IFs incluídos somente em tempo de desenvolvimento.
Por causa disto, a partir do Java 1.4 foi adicionada a opção assert para você realizar averiguações de sentenças de resultado esperado. Com isso, você informa durante a execução do programa se quer ativar ou inativar estes testes de assert. Exemplos:
Para habilitar os testes assert:
java -ea ClasseAplicacao
// ou
java -enableassertions ClasseAplicacao
Para desabilitar os testes assert:
java -da ClasseAplicacao
// ou
java -disableassertions ClasseAplicacao
Obs.: O assert é desabilitado por padrão quando você executa sua aplicação.
Acho que você já se deu conta do benefício do assert para caso de averiguação em desenvolvimento. Não é preciso você remover os assert caso esteja frequentemente dando suporte ou fazendo evoluções numa aplicação.
Espero ter esclarecido.
wiliamps
wiliamps, perfeito! Entendi muito bem a sua explicação, entendi os benefícios e estou presupondo que se essa condição do assert for false acontece o AssetionError. Obrigado!
Isso mesmo, não deixei claro mesmo. Mas você tem razão, em caso da sentença retornar falso, uma AssertionError é lançada de acordo com a mensagem que você determinar.
Código de AssertionTest.java:
public class AssertionTest {
public static void main(String[] args) {
String corDoCavaloBranco = "azul";
// Lança uma exceção sem mensagem (null)
try {
assert corDoCavaloBranco.equals("branco");
} catch (AssertionError e) {
System.err.println(e.getMessage());
}
// Lança uma exceção com mensagem (null)
try {
assert corDoCavaloBranco.equals("branco") : "Cor do cavalo branco não é branco.";
} catch (AssertionError e) {
System.err.println(e.getMessage());
}
}
}
Compilando:
javac AssertionTest.java
Testando:
java -ea AssertionTest.java
Resultado:
null
Cor do cavalo branco não é branco.