Search code examples
javadatasourcejndi

How can I spoof a jndi lookup for a datasource without a app server


I want to test some new functionality which is part of an internal web app. This new code uses a database connection normally provided by an app server (tomcat).

I do not want to recreate the entire web app on my local machine to test the new code, since I only need to run one function.

Does anyone know how I can 'spoof' a Context, or Datasource, to retrieve the database config, without actually creating a web app instance on a server?


Solution

  • With the help of Spring SimpleNamingContextBuilder and Apache BasicDataSource, you can do something like this (I usually have this in a static block in test classes that need JNDI):

    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(db_driver_name);
    dataSource.setUrl(db_connection_url);
    dataSource.setUsername(db_username);
    dataSource.setPassword(db_password);
    SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
    builder.bind(jndi_name, dataSource);
    builder.activate();
    

    The value of jndi_name might look like this: java:comp/env/jdbc/my-db

    Once this is set up, code that normally looks up the database connection via JNDI should work. The code above would for example work with this Spring config:

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value="java:comp/env/jdbc/my-db"/>
    </bean>