Java coding tips - Minimum JNDI mock for unit tests

Minimum JNDI mock for unit tests:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.spi.InitialContextFactory;

public class InitialContextFactoryForTest 
implements InitialContextFactory {

    private static Context context;

    static {
        try {
            context = new InitialContext(true) {
                Map<String, Object> bindings = new HashMap<String, Object>();

                @Override
                public void bind(String 
name, Object obj)
                        throws NamingException {
                    bindings.put(name, obj);
                }

                @Override
                public Object lookup(String name) 
throws NamingException {
                    return bindings.get(name);
                }
            };
        } catch (NamingException e) { // can't happen.
            throw new RuntimeException(e);
        }
    }

    public Context getInitialContext(Hashtable<?, ?> 
environment)
            throws NamingException {
        return context;
    }

    public static void 
bind(String name, Object obj) {
        try {
            context.bind(name, obj);
        } catch (NamingException e) { // can't happen.
            throw new RuntimeException(e);
        }
    }
}

Using in test:

@Override
    protected void setUp() throws Exception {
        // sets up the InitialContextFactoryForTest as default factory.
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                InitialContextFactoryForTest.class.getName());

        // binds the object
        dataSource = getDataSource();
        InitialContextFactoryForTest.bind("jdbc/mysql", 
dataSource);
    }

öüó

Mar 18, 2012
comments powered by Disqus

Links

Cool

RSS