Saltar al contenido

Cómo falsificar InitialContext con el constructor predeterminado

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *