使用Spring创建用于JUnit测试的JNDI资源

直到最近,我还使用静态方法来设置内存数据库(HSQLDB)。 我在JUnit测试的setUp / tearDown中调用了这些方法。 当我使用Spring时,这总是让我感到不自然,并且所有内容都应在其应用程序上下文中运行。

2016-04-22-jndi-junit

创建一个简单的JNDI bean

在生产中使用JNDI时,我还必须为我的应用程序创建JNDI资源。 一个简单的使用Apache Commons DBCP的Spring Bean可以解决这个问题:

public class JndiBean {

    public JndiBean() {
        try {
            DriverAdapterCPDS cpds = new DriverAdapterCPDS();
            cpds.setDriver("org.hsqldb.jdbc.JDBCDriver");
            cpds.setUrl("jdbc:hsqldb:mem:testdb");
            cpds.setUser("SA");
            cpds.setPassword("");

            SharedPoolDataSource dataSource = new SharedPoolDataSource();
            dataSource.setConnectionPoolDataSource(cpds);
            dataSource.setMaxActive(10);
            dataSource.setMaxWait(50);

            SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
            builder.bind("java:comp/env/jdbc/timeandbill", dataSource);
            builder.activate();
        } catch (NamingException | ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

您不应该三思而后行地使用此基本配置,但是它对于单元测试非常有效。

首先,我创建了一个驱动程序适配器,其中包含连接数据库所需的一切。 它可以是MySQL,Postgres或您喜欢的其他任何东西。

然后,我创建一个SharedPoolDatasource。 由于测试通常按顺序运行,因此实际上不必保持大量连接。 即使不是这样,通常也将至少针对每个测试类创建Spring上下文。 您不太可能从这里获得池的好处,但是我想坚持生产服务器通常会做的事情。

SimpleNamingContextBuilder最终将先前创建的数据源绑定到JNDI上下文。 如您所见,这是一件很简单的事情:只需将其绑定,然后激活即可完成。

将JNDI bean添加到上下文

下一步是将其添加到第二个applicationContext.xml中,该文件仅由JUnit测试加载。 我位于我的单元测试文件夹中,并且包含:

<bean id="jndi" class="de.grobmeier.tab.webapp.JndiBean" lazy-init="false" />

测试中的这些注释确保我加载了所有applicationContext文件:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:applicationContext.xml"})
public class TimeConverterTest {

我的生产applicationContext包含以下内容:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/timeandbill"/>
    <property name="resourceRef" value="true" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
</bean>

由于没有在JUnit级别运行的Java EE服务器。 而是手动创建了JNDI连接。 在生产中,不会加载JUnits applicationContext,并且Java EE容器提供JNDI资源。

旁注:我发现Mybatis依赖于Springs自动装配“ byType”功能。

翻译自: https://www.javacodegeeks.com/2016/11/create-jndi-resources-junit-testing-using-spring.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值