Informações
| Tipo: | Tutorial |
|---|---|
| Data de Publicação: | 01/01/2004 |
| Revisado em: | 01/01/2004 |
Vote!
Tags Relacionadas
Comentários ( 0 )
Imprimir
Assertions
por:
Ulisses Telemaco (ulisses@j2eebrasil.com.br)
Este artigo provê uma visão geral sobre Assertions, um novo recurso oferecido a partir da versão 1.4 do J2SE. Assertions são utilizada apenas em tempo de desenvolvimento. Sua ídeia fundamental é garantir a qualidade do código executando testes que permitem a validação de lógica e de suposições sobre o programa. Ao fim do desenvolvimento esse recurso é desabilitado.
Codificando com Assertions
Sintaxe Básica
A codificação de Assertions funciona de duas maneiras:
1. assert expressao1; 2. assert expressao1: expressao2; |
No código acima expressao1, tanto na linha 1 quanto na linha 2,
tem que ser do tipo boolean. Já expressao2
pode ser de qualquer tipo. Ela será convertida para String
dentro do construtor da AssertionError.
java.lang.AssertionError
Esta exceção é disparada quando ocorre uma falha em alguma assertion,
ou seja, a expressao1 é falsa. Quando isto ocorre o construtor é chamado
da AssertionError. Caso exista algum argumento (nesse caso a
expressao2), este é passado ao construtor da classe que exibe uma mensagem
de erro. Veja o exemplo abaixo:
1. public class Exemplo {
2.
3. public static void main(String[] args) {
4. assert teste(): "Mensagem de Erro";
5. }
6.
7. public static boolean teste(){
8. return false;
9. }
10.
11.}
|
O resultado da execução deste código é a seguinte impressão:
java.lang.AssertionError: Mensagem de erro
at Exemplo.main(Exemplo.java:5)
Exception in thread "main"
|
Compilando uma Classe com Assertions
Para compilar uma classe que contenha Assertions basta incluir o argumento -source 1.4
na linha de comando, esse comando define o nível de compatibilidade do compilador, pois a palavra assert
pode ter sido usada como identificador em programas compatíveis com versões anteriores a 1.4 do J2SE, portanto,
se em tempo de compilação, a palavra chave -source 1.4 não for usada, será possível utilizar
assert como identificador. Isso foi feito afim de manter a compatibilidade com códigos
"antigos". Veja como fica a compilação utilizando Assertions:
LinhaDeComando> javac -source 1.4 Exemplo.java |
Habilitando Assertions em tempo de execução
Mesmo tendo compilado a classe compatível com Assertions, ainda é necessário habilitá-lo em tempo de execução.
Para isso basta incluir o argumento -ea ou -enable NomeDaAssertion.
Veja um exemplo:
LinhaDeComando> java -ea Exemplo |
Vejamos mais exemplo. O código abaixo tem a simples função de testar se o uso de Assertions está habilitado.
1. public class T {
2.
3. public static void main(String[] args) {
4. boolean enabled = false;
5. try{
6. assert enabled == true : "Assertion esta HABILITADO!!!";
7. System.out.println("Assertion esta DESABILITADO!!!");
8. } catch (AssertionError ae){
9. System.out.println(ae.getMessage());
10. }
11. }
|
A figura abaixo representa a compilação e execução do programa acima (com o recurso assertion habilitado e desabilitado):
Vejamos as linhas de comando acima:
| (1) | Esse comando tenta compilar a classe java sem especificar que ela foi codificada seguindo a versão 1.4.
Essa compilação causará alguns erros; |
| (2) | A compilação dessa vez ocorre sem problemas; |
| (3) | A execução da classe é feita sem o recurso assertion habilitado. A classe é executada sem levantar
nenhuma exceção (a mensagems "Assertion esta DESABILITADO!!!" é impressa); |
| (4) | A execução da classe é feita dessa vez com o recurso assertion habilitado. Essa execução
levanta uma exceção do tipo AssertionError (a mensagems "Assertion esta HABILITADO!!!"
é impressa).
|
Usando Assertions
Assertions são comumente utilizadas três ocasiões: Precondition, Postcondition e Class invariant. Precondition é a realização de alguma validação quando determinado método é chamado. Veja o exemplo:
1. public class Calculadora {
2.
3. public static void main(String[] args) {
4. Calculadora calc = new Calculadora();
5. System.out.println(calc.dividir(1,2));
6. System.out.println(calc.dividir(1,-1));
7. System.out.println(calc.dividir(1,0));
8. }
9.
10. public float dividir(float numero, float dividendo) {
11. assert dividendo != 0 : "Dividendo igual a zero";
12. return (numero/dividendo);
13. }
14. }
|
Na linha 11 ocorre a validação do dividendo. Quando o código é executado o resultado é o seguinte:
0.5
-1.0
java.lang.AssertionError: Dividendo igual a zero
at Calculadora.dividir(Calculadora.java:11)
at Calculadora.main(Calculadora.java:7)
Exception in thread "main"
|
Já em Postcondition é realizada uma validação ao final da execução de um determinado método, a fim de garantir a qualidade do resultado. Veja o exemplo:
1. public void incluirUsuario(User user){
2. gravaUsuario(user);
3. assert existeUsuario(user) : "O usuario nao foi incluso";
4. }
5.
6. /**
7. * Metodo responsavel por verificar a existencia de determinado usuario
8. * na base de dados.
9. */
10. public boolean existeUsuario(User user) {
11. (...)
12. }
|
No código acima foi feito todo um processo de inclusão de um usuário e na linha 3 existe `
uma verificação se o mesmo foi incluído.
Class invariants é fato de verificar o estado de qualquer constante em qualquer momento de
uma classe. Esse tipo de verificação não possuí nenhuma característica específica a não ser
verificar constantes da classe em qualquer momento da execução.
