JNDI是J2EE 的标准之一,它依赖于容器, 比如说在开发测试阶段,datasource 或者jms 的factory 是通过JNDI所寻得的话,那么要测试的话,总是要部署到应用服务器上面 比如 TOmcat,weblogic或者Jboss等,并且 这些应用服务器必须设定好对应的JNDI,比如说我要把 某个datasource 绑定到 名为 appDS的JNDI上面,然后代码部分也是通过 context.looiup的方法取寻得这个命为appDS的对象,测试起来 相当麻烦。
在做集成测试的时候,笔者认为,这些步骤是必须的,因为集成测试的时候是要涵盖各个组件之间能很好沟通工作,那如果是单元测试的话,也是这样做的话 就有点得不偿失的了,因为单元测试部分 指向测试 lookup这个部分的代码能工作啊,或者说 我只是要通过lookup拿到一个对象而已。
在推出 spring test 之前, 笔者曾经用过 MockEJB ,easyMock这类的 类库 来做到模拟上下文,绑定一下测试需要的JNDI等。使用起来也是颇为方便。 而Spring Test 提供的 mock jndi部分则更为轻便和容易使用啦。
Mock JNDI 只有三个类
我们可以看到 SpringTest 中 提供的 mock jndi 只有三个类, ExpectedLookupTemplate, SimpleNamingContext,SimpleNamingContextBuilder.
SimpleNamingContext 这个类就是Spring用来Mock JNDI的类,里面用2个hashmap来存放对象的
SimpleNamingContextBuilder 这个类呢是 SimpleNamingContext 的构建类,
ExpectedLookupTemplate
使用最多的是SimpleNamingContextBuilder 这个构建类。 使用这个类 来创建 修改 JNDI Context
// creates an JNDI Context and combine resources SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder(); builder.bind("appDS", db);