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