【发布时间】:2012-10-14 17:07:02
【问题描述】:
问题陈述
我希望能够对连接到数据库的方法运行 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 都需要创建到该数据源的连接。
代码
我在这段代码 sn-p 中忽略了错误检查和类结构,以关注问题的核心。希望这不会给其他人带来问题。方括号中的文本不是实际文本。
我们创建连接的代码是这样的:
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();
我希望能够在不对其进行任何更改的情况下测试依赖于此代码的方法。
properties-service.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 文件,以减少重复的配置设置。
到目前为止,我所有的研究都以“使用 Spring”的建议结束,但我认为我们还没有准备好打开那罐蠕虫。我不是 JBoss 方面的专家,但如果需要更多关于 JBoss 设置的详细信息以获得有用的答案,我会尽我所能得到它们,但我可能需要一些关于在哪里查找的指示。
Stackoverflow 研究参考资料:
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
@ 987654324@
【问题讨论】:
-
“我希望能够在不对其进行任何更改的情况下测试依赖于此代码的方法。” -- 如果你想测试依赖于这段代码的方法中的逻辑,你可以模拟这个连接并仍然测试那些方法吗?
-
你检查过 Mockito (code.google.com/p/mockito) 吗?这是一个很棒的模拟框架,可以成为模拟 JNDI 连接的好帮手
-
Properties.load()采用Reader或InputStream。你能澄清一下[name of properties file here]到底是什么吗? -
致artbristol:这是一个输入流。我将扩展代码以包含这些详细信息,因为再看一遍,那里有另一个对 JBoss 设置的属性的引用。
-
我目前正在根据 Zack Macomber 和 weltraumpirat 的建议研究 mockito。
标签: java eclipse unit-testing junit jndi