单元测试困境:在不运行 JBoss 或 Spring 的情况下使用 JNDI 数据源
问题陈述
我希望能够对连接到数据库的方法运行 junit 测试。
当前设置
Eclipse Java EE IDE – Java 代码不使用框架。开发人员(包括我)希望在尝试将代码移动到Spring框架之前对当前遗留代码进行更健壮的测试,以便我们可以在此过程中证明行为仍然正确。
JBoss 4.2 – 供应商软件的版本限制 (Adobe LiveCycle ES2);我们的Java Web应用程序使用JBoss的此设置来运行,并使用Adobe LiveCycle API。
我们无法在Eclipse中成功运行供应商配置的JBoss - 我们已经花了数周时间尝试这样做,包括联系为Adobe LiveCycle配置JBoss提供支持的公司。据推测,问题在于 Eclipse 中设置的内存限制问题,但到目前为止,在 Eclipse 中成功启动 JBoss 服务器时,更改内存设置仍然失败。目前,试图让JBoss在Eclipse内部运行的工作被搁置了。
数据库连接是在 JBoss 启动时加载的 JNDI 数据源中定义的。我们的 Web 应用程序和 Adobe LiveCycle 都需要创建与此数据源的连接。
法典
我在这个代码片段中掩盖了错误检查和类结构,以专注于问题的核心。希望这不会给其他人带来麻烦。方括号中的文本不是实际文本。
我们创建连接的代码如下所示:
Properties props = new Properties();
FileInputStream in = null;
in = new FileInputStream(System.getProperty("[Properties File Alias]"));
props.load(in);
String dsName = props.getProperty(“[JNDI data source name here]”);
InitialContext jndiCntx = new InitialContext();
DataSource ds = (DataSource) jndiCntx.lookup(dsName);
Ds.getConnection();
我希望能够测试依赖于此代码的方法,而无需对其进行任何更改。
对属性服务.xml文件中的属性文件别名的引用:
<!-- ==================================================================== -->
<!-- System Properties Service -->
<!-- ==================================================================== -->
<!-- Allows rich access to system properties.-->
<mbean code="org.jboss.varia.property.SystemPropertiesService"
name="jboss:type=Service,name=SystemProperties">
<attribute name="Properties">
[Folder Alias]=[filepath1]
[Properties File Alias]=[filepath2]
</attribute>
</mbean>
位于 filepath2 的属性文件中的代码段
[JNDI data source name]=java:/[JNDI data source name]
此数据源的 JNDI xml 文件设置如下:
<datasources>
<local-tx-datasource>
<jndi-name>[JNDI data source name here]</jndi-name>
<connection-url>jdbc:teradata://[url]/database=[database name]</connection-url>
<driver-class>com.teradata.jdbc.TeraDriver</driver-class>
<user-name>[user name]</user-name>
<password>[password]</password>
<!-- sql to call on an existing pooled connection when it is obtained from pool -->
<check-valid-connection-sql>SELECT 1+1</check-valid-connection-sql>
</local-tx-datasource>
</datasources>
我对解决方案的想法
我是否可以在@BeforeClass方法中做些什么,以使上述代码正在寻找的属性在没有JBoss的情况下可用?也许以某种方式使用java.util.Properties类的setProperty方法?如果可能的话,我还想使用JBoss从中读取的JNDI xml文件,以减少重复的配置设置。
到目前为止,我的所有研究都以“使用春天”的建议结束,但我认为我们还没有准备好打开那罐蠕虫。我不是 JBoss 方面的专家,但是如果需要更多有关 JBoss 设置的详细信息来获得有用的答案,我会尽我所能来获得它们,尽管我可能需要一些关于在哪里查找的指示。
Stackoverflow Research References:
Jndi lookup in junit using spring
Out of container JNDI data source
其他研究参考文献:
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Properties.html
http://docs.oracle.com/javase/jndi/tutorial/basics/prepare/initial.html