问题陈述
我希望能够对连接到数据库的方法运行 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();
我希望能够在不对其进行任何更改的情况下测试依赖于此代码的方法。
在 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>
我对解决方案可能在哪里的想法
Is there something I can do in a @BeforeClass method in order to make the properties the above code is looking for available without JBoss? Maybe somehow using the setProperty method of the java.util.Properties class? I would also like to use the same JNDI xml file that JBoss reads from, if possible, in order to reduce duplicate configuration settings.
So far all of my research ends with the advice “Use Spring”, but I don’t think we’re ready to open that can of worms yet. I am not an expert in JBoss, but if more details of our JBoss setup are needed for a helpful answer, I will do my best to get them, though I will likely need some pointers on where to look.
Stackoverflow Research references:
Jndi lookup in junit using spring
Out of container JNDI data source
Other research references:
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