传统的做法是更改您的代码,以便将其
Context注入(通过依赖项注入框架或手动)。然后,您只需在单元测试中传递一个模拟即可。
如果您不能执行此操作,并且您的代码必须创建
IntialContext自身,那么您将需要设置一个伪造的JNDI实现,可以在其中植入模拟。如果您在网络上搜索内存中的JNDI实现或模拟JNDI实现,则可以找到各种选项,也可以自己编写。基本上,您将需要一个实现,
InitialContextFactory该实现只返回一个合适的模拟,然后通过设置
java.naming.factory.initialsystem属性选择该模拟。
我在编写必要的课上有裂痕。干得好:
public class MockInitialContextFactory implements InitialContextFactory { private static final ThreadLocal<Context> currentContext = new ThreadLocal<Context>(); @Override public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException { return currentContext.get(); } public static void setCurrentContext(Context context) { currentContext.set(context); } public static void clearCurrentContext() { currentContext.remove(); }}public class MockInitialContextRule implements TestRule { private final Context context; public MockInitialContextRule(Context context) { this.context = context; } @Override public Statement apply(final Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { System.setProperty(Context.INITIAL_CONTEXT_FACTORY, MockInitialContextFactory.class.getName()); MockInitialContextFactory.setCurrentContext(context); try { base.evaluate(); } finally { System.clearProperty(Context.INITIAL_CONTEXT_FACTORY); MockInitialContextFactory.clearCurrentContext(); } } }; }}用法如下:
public class FooTest { private final Context context = mock(Context.class); @Rule public MockInitialContextRule mockInitialContextRule = new MockInitialContextRule(context); @Test public void testName() throws Exception { // set up stubbings on the context mock // invoke the pre under test }}


