2013-12-17 10 views
5

mio Java EE 7 applicazione, che utilizza Primavera, gira su Tomcat 7. accede a un database utilizzando un DataSource JNDI, definito da questa linea in context.xml:È possibile evitare di ridefinire l'origine dati JNDI quando si utilizza JUnit?

<Resource auth="Container" driverClassName="org.postgresql.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/leadmanager" password="xxxxxxxx" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/leadmanager" username="postgres"/> 

ho creato alcuni test JUnit. Quando ho provato a farli funzionare (in Eclipse, facendo clic destro la classe di test e selezionando Esegui come | JUnit Test), si è verificata un'eccezione:

javax.persistence.PersistenceException: [PersistenceUnit: leadmanager] Unable to build EntityManagerFactory 
... 
Caused by: org.hibernate.service.jndi.JndiException: Error parsing JNDI name [java:/comp/env/jdbc/leadmanager] 
... 
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 
... 

Grazie a questo post utile - https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit - ho trovato un soluzione. Ho aggiunto questo alla mia classe di test:

@BeforeClass 
public static void setUpClass() throws Exception { 

    // create initial context 
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory"); 
    System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");    
    InitialContext ic = new InitialContext(); 

    ic.createSubcontext("java:"); 
    ic.createSubcontext("java:/comp"); 
    ic.createSubcontext("java:/comp/env"); 
    ic.createSubcontext("java:/comp/env/jdbc"); 

    PGPoolingDataSource ds = new PGPoolingDataSource(); 
    ds.setServerName("localhost:5432/leadmanager"); 
    ds.setUser("postgres"); 
    ds.setPassword("xxxxxxxx"); 
    ic.bind("java:/comp/env/jdbc/leadmanager", ds); 
} 

Ma è orribile! Sono costretto a definire il mio datasource due volte, una volta in context.xml e di nuovo nella mia classe di test. E sono costretto a memorizzare la password del mio database nel codice Java che verrà archiviato al controllo del codice sorgente.

ho già consultato questo post, così: Setting up JNDI Datasource in jUnit

Esiste un modo migliore?

+0

vorrebbe una risposta a questa domanda – chrismarx

risposta

0

Il motivo è che il test non è in esecuzione all'interno di tomcat, ma viene eseguito in un'istanza separata di JVM.

Prova a creare il test dell'unità utilizzando Arquillian - questo strumento impacchetterà il test come una semplice applicazione Web, che viene eseguita all'interno del tuo tomcat. Il risultato è che tutto ciò che è accessibile in Tomcat sarà accessibile nei test, comprese le risorse.

0

È anche possibile utilizzare TomcatJNDI. Legge i file di configurazione di Tomcat e crea un ambiente JNDI come nella tua applicazione web. E 'facile come questo esempio di codice:

TomcatJNDI tomcatJNDI = new TomcatJNDI(); 
tomcatJNDI.processContextXml(contextXmlFile); 
tomcatJNDI.start(); 

Ora è possibile accedere a tutte le risorse che avete dichiarate nei file di configurazione di Tomcat.

Find out more about it here.

Problemi correlati