Nuestro equipo de redactores ha estado mucho tiempo buscando la solución a tus interrogantes, te dejamos la respuestas por eso nuestro objetivo es serte de gran ayuda.
Solución:
Aprovecha el hecho de que InitialContext
utiliza un SPI para manejar su creación. Puede conectarse a su ciclo de vida creando una implementación de javax.naming.spi.InitialContextFactory
y pasar eso a sus pruebas a través de la propiedad del sistema javax.naming.factory.initial
(Context.INTITIAL_CONTEXT_FACTORY
). Es más simple de lo que parece.
Dada esta clase:
public class UseInitialContext
public UseInitialContext()
try
InitialContext ic = new InitialContext();
Object myObject = ic.lookup("myObject");
System.out.println(myObject);
catch (NamingException e)
e.printStackTrace();
Y este impl de InitialContextFactory
:
public class MyInitialContextFactory implements InitialContextFactory
public Context getInitialContext(Hashtable, ?> arg0)
throws NamingException
Context context = Mockito.mock(Context.class);
Mockito.when(context.lookup("myObject")).thenReturn("This is my object!!");
return context;
Crear una instancia de UseInitialContext
en una prueba junit con
-Djava.naming.initial.factory=initial.context.test.MyInitialContext
en las salidas de la línea de comando This is my object!!
(fácil de configurar en eclipse). Me gusta Mockito para burlarse y tropezar. También recomendaría el de Micheal Feather Trabajando efectivamente con código heredado si maneja mucho código heredado. Se trata de cómo encontrar costuras en los programas para aislar piezas específicas para la prueba.
Aquí está mi solución para configurar el contexto inicial para mis pruebas unitarias. Primero agregué la siguiente dependencia de prueba a mi proyecto:
org.apache.tomcat
catalina
6.0.33
test
Entonces creé un static método con el siguiente código:
public static void setupInitialContext() throws Exception
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("jdbc");
PGSimpleDataSource ds = new PGSimpleDataSource();
ds.setDatabaseName("postgres");
ds.setUser("postgres");
ds.setPassword("admin");
ic.bind("jdbc/something", ds);
Finalmente en cada uno de mis clase de prueba Agrego un método @BeforeClass que llama a setupInitialContext.
Intenta configurar las variables del sistema antes:
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES,
"org.apache.naming");
InitialContext ic = new InitialContext();
Si usa JUnit, siga este documento: https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit
Aquí puedes ver las reseñas y valoraciones de los lectores
Te invitamos a apoyar nuestro estudio poniendo un comentario y dejando una valoración te estamos eternamente agradecidos.