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?
vorrebbe una risposta a questa domanda – chrismarx