Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 4 di 68
  • livello ninja
Indice lezioni

Annotations e unit test

Dopo aver introdotto le annotations passiamo alla fase di realizzare degli unit test che ci consentano di verificare che i nostri moduli si comportino correttamente.
Dopo aver introdotto le annotations passiamo alla fase di realizzare degli unit test che ci consentano di verificare che i nostri moduli si comportino correttamente.
Link copiato negli appunti

Nella precedente lezione abbiamo introdotto le annotations javax.ejb.Local, javax.ejb.Remote e javax.ejb.Stateless, ora abbiamo la
necessità di realizzare degli unit test che ci consentano di verificare che i nostri moduli
si comportino correttamente. La libreria JUnit permette di sviluppare dei casi di test per gli Ejb
che espongono un'interfaccia remote. Creiamo nel modulo Ejb il package it.html.progetto1.test
e al suo interno la seguente classe:

package it.html.progetto1.test;
import java.util.Properties;
import javax.naming.*;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import it.html.progetto1.ejb30.ConverterBeanRemote;
import junit.framework.TestCase;
public class ConverterIntegrationTestCase {
	private static Context namingContext;
	private static ConverterBeanRemote ejb30Remote;
	private static final String REMOTE_JNDI_NAME="/Progetto1Ear/ProgettoEjb1/ConverterBean!it.html.progetto1.ejb30.ConverterBeanRemote";
	@BeforeClass
	public static void obtainProxyReferences() throws NamingException{
        Properties jndiProperties = new Properties();
        jndiProperties.put("jboss.naming.client.ejb.context", true);
        jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
        jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        namingContext = new InitialContext(jndiProperties);
	}
	@Test
	public void testConverter() throws NamingException{
		ejb30Remote = (ConverterBeanRemote)namingContext.lookup(REMOTE_JNDI_NAME);
		TestCase.assertEquals(ejb30Remote.celsiusToFahrenheit(30.0f), 86.0f);
		TestCase.assertEquals(ejb30Remote.fahrenheitToCelsius(86.0f), 30.0f);
	}
	@AfterClass
	public static void tearDownClass() throws NamingException {
		namingContext.close();
	}
}

La classe di test ottiene un InitialContext per il recupero di un riferimento all'interfaccia remote di un session bean
attraverso il servizio JNDI. Il metodo testConverter utilizza il riferimento all'interfaccia dell'Ejb per invocare i metodi
del session bean all'interno di assert di test.

Per eseguire il test avviamo l'application server Jboss WildFly,
facciamo il deploy dell'applicazione enterprise attendendo il completamento dell'operazione. Per avviare il test è sufficiente evidenziare con il mouse
il metodo testConverter e, successivamente, con il tasto destro del mouse aprire il menù ed eseguire il Run
JUnit.

Purtroppo non siamo in grado di effettuare il lookup al JNDI per ottenere riferimenti ad interfacce locali all'interno di un metodo JUnit.
Per questa ragione all'interno della guida, per facilitare il test degli Ejb realizzati senza aggiungere ulteriore complessità,
faremo in modo di dotare ogni Ejb di interfacce remote e local. Esistono però strumenti, come ad esempio Arquillian,
che consentono la realizzazione di test in modo più potente e completo.

Le novità aggiunte da Ejb 3.1 sono state la possibilità di definire session bean di tipo local senza la necessità di specificare
un'interfaccia. Definiamo nel modulo Ejb il nuovo package it.html.progetto1.ejb31 ed inseriamo in esso la seguente classe che
mostra come realizzare, in modo alternativo, il session bean converter di tipo local nella versione Ejb 3.1:

package it.html.progetto1.ejb31;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
/**
 * Session Bean implementation class ConverterBean
 */
@Stateless(name = "ConverterBean31", mappedName = "ConverterBean31")
public class ConverterBean {
    /**
     * Default constructor.
     */
    public ConverterBean() {
        // TODO Auto-generated constructor stub
    }
    public float celsiusToFahrenheit(float temperature) {
		return temperature * 1.8f + 32;
    }
    public float fahrenheitToCelsius(float temperature) {
		return (temperature - 32) / 1.8f;
    }
}

Ejb 3.2 ha reso possibile non specificare annotazioni per le interfacce definendo un comportamento di default.
Un'interfaccia non marcata con nessun tipo di annotazione è interpretata come local. Anche in questo caso
creiamo il package it.html.progetto1.ejb32 ed inseriamo l'interfaccia ConverterBeanLocal e la classe del bean Converter.
Per dimostrare la nuova caratteristica la classe implementa solo ConverterBeanLocal. Il comportamento
di default sarebbe stato disattivato se la nostra classe avesse implementato anche l'interfaccia remote.

package it.html.progetto1.ejb32;
public interface ConverterBeanLocal extends Converter{}

package it.html.progetto1.ejb32;
import javax.ejb.Stateless;
/**
 * Session Bean implementation class ConverterBean
 */
@Stateless(name = "ConverterBean32",mappedName = "ConverterBean32")
public class ConverterBean implements ConverterBeanLocal {
    /**
     * Default constructor.
     */
    public ConverterBean() {
        // TODO Auto-generated constructor stub
    }
    @Override
    public float celsiusToFahrenheit(float temperature) {
		return temperature * 1.8f + 32;
    }
    @Override
    public float fahrenheitToCelsius(float temperature) {
		return (temperature - 32) / 1.8f;
    }
}

Nel successivo capitolo vedremo la dependency injection di un Ejb 3, la struttura dei nomi JNDI per il recupero di un
session bean, i metodi asincroni di Ejb 3.1 e gli aspetti transazionali legati all'esecuzione di un metodo.

Ti consigliamo anche