junit jndi
直到最近,我还使用静态方法来设置内存数据库(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
junit jndi