Dalla versione JDK 1.4 è stato introdotto il costrutto assert che permette di testare le proprie applicazioni. Un assert non è altro che una condizione necessaria che lo sviluppatore ritiene si debba verificare in un determinato momento. Qualora tale condizione non è verificata, il programma viene terminato.
Il costrutto assert prevede due possibili forme:
- assert booleanExpression;
- assert booleanExpression : message.
Ad esempio, l'istruzione
assert x>0;
provoca la terminazione del programma qualora la variabile intera x sia minore o uguale di 0.
Questa istruzione corrisponde alla seguente forma compatta:
if (!(x>0))
throw new AssertException();
Il vantaggio principale del costrutto assert è che in fase di esecuzione può essere disabilitato. È possibile, quindi, utilizzare questa funzionalità esclusivamente per testare l'applicazione. In fase di messa in opera, è possibile disattivarla per eliminare il tempo di overhead legato alla sua gestione.
Analizziamo più da vicino questa caratteristica del linguaggio con un semplicissimo esempio:
Listato 1. Verifica che un numero in input sia positivo con assert
public class HtmlTestAssert{
public static void main(String[] args){
int a = Integer.parseInt(args[0]);
assert a > 0 : "a deve essere maggiore di 0" + a;
System.out.println("a è un numero positivo");
}
}
La nostra classe riceve in input un valore numerico. Mediante il costrutto assert verifichiamo che tale valore sia un numero positivo.
Di default le assert sono disabilitate. Per abilitarle è necessario utilizzare il flag -ea
. È possible anche abilitare/disabilitare le assert esclusivamente per alcuni package o alcune classi.
Compiliamo la nostra classe ed eseguiamola con il seguente comando:
java -ea HtmlAssertTest -6
L'output sarà il seguente:
Exception in thread "main" java.lang.AssertionError: a (-6) deve essere maggiore di 0
at HtmlTestAssert.main(HtmlTestAssert.java:6)
Naturalmente l'espressione booleana può anche essere un metodo che restituisce un valore boolean. Il nostro esempio, può essere trasformato così:
Listato 2. Verifica che un numero in input sia positivo con dati booleani
public class HtmlTestAssert {
public static void main(String[] args){
assert test(Integer.parseInt(args[0])) : "a deve essere maggiore di 0";
System.out.println("a è un numero positivo");
}
public static boolean test(int a){
if (a > 0)
return true;
else
return false;
}
}
È possibile abilitare le assert anche soltanto all'interno di determinati package. Ad esempio, se volessimo abilitare le assert soltanto nel package it.html, potremmo lanciare il comando
java -ea:it.html HtmlAssertTest
Poiché il costrutto assert è stato introdotto dalla versione 1.4, è necessario prestare particolare attenzione alla fase di compilazione, tenendo presente la versione Java che viene utilizzata. Nelle precedenti versioni, infatti, la parola assert poteva essere utilizzata come nome di variabile o nome di metodo.
Analizziamo le possibili situazioni:
- se utilizziamo una versione precedente alla 1.4, non è possibile utilizzare le asserzioni poiché assert non è riconosciuta come una parola chiave;
- se utilizziamo la versione 1.4, e vogliamo abilitare il costrutto assert, bisogna compilare il codice con il flag "-source 1.4";
Ad esempio:javac -source 1.4 HtmlAssertTest.java
Se non utilizziamo il flag, il compilatore non considererà assert come parola chiave e quindi, verranno visualizzati dei warning, che segnalano allo sviluppatore che dalla versione 1.4, assert è una parola chiave del linguaggio.
- Se utilizziamo una versione superiore alla 1.4, ad esempio la 1.5, sarà implicitamente utilizzato il flag "-source 1.5".