Informações

Tipo: Tutorial
Data de Publicação: 01/01/2004
Revisado em: 01/01/2004

Vote!

  • Currently 4,5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags Relacionadas

certificacao introducao

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.

Comente!

Observações

Os campos em negrito são obrigatórios.

Para evitar problemas, este espaço é moderado. Após o envio do comentário será necessário aguardar pela sua aprovação.