我已经在这个问题上工作了几天,这让我发疯了。
我使用Jboss 4.2.3获得了一些遗留代码。我最近将项目转换为Maven以进行依赖关系管理,但为项目编写的单元测试需要数据源。当我禁用测试时,程序运行正常,但是当我启用测试时,它会抛出以下内容:
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
我在pom文件中列出了jboss嵌入式依赖项。
<dependency>
<groupId>org.jboss.embedded</groupId>
<artifactId>jboss-embedded-all</artifactId>
<version>beta3.SP12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.embedded</groupId>
<artifactId>jboss-embedded</artifactId>
<version>beta3.SP12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.embedded</groupId>
<artifactId>hibernate-all</artifactId>
<version>beta3.SP12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.embedded</groupId>
<artifactId>thirdparty-all</artifactId>
<version>beta3.SP12</version>
<scope>test</scope>
</dependency>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<additionalClasspathElements>
<additionalClasspathElement>src/test/bootstrap</additionalClasspathElement>
</additionalClasspathElements>
<forkMode>once</forkMode>
<argLine>-Dsun.lang.ClassLoader.allowArraySyntax=true</argLine>
<includes>
<include>**/*Test.java</include>
</includes>
<skip>false</skip>
</configuration>
</plugin>
在src / test / bootstrap / deploy中,我放置了dev-ds.xml文件,该文件正由容器拾取。
Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=jdbc/theDS' to JNDI name 'java:jdbc/theDS'
我的dev-ds文件看起来像这样(有些混淆,请原谅任何错别字)
<datasources>
<local-tx-datasource>
<jndi-name>jdbc/theDS</jndi-name>
<connection-url>jdbc:oracle:thin:@xxx.xxx.xxx:1521:DEVDB</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>user</user-name>
<password>password</password>
</local-tx-datasource>
</datasources>
实际测试本身使用Mockito来尝试获取数据源。
@BeforeClass
public static void setUpClass() throws Exception
{
if( ! containerRunning )
{
Bootstrap bootstrap = Bootstrap.getInstance();
bootstrap.bootstrap();
containerRunning = true;
}
}
@Before
public void setUp()
{
MyDAO dao = spy( new MyDAO() );
try
{
InitialContext ctx = new InitialContext();
dao.datasource = (DataSource) ctx.lookup( "java:jdbc/theDS" );
Connection conn = dao.datasource.getConnection(); //bang, we're dead
}
例外:
Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Failed to register driver for: oracle.jdbc.driver.OracleDriver; - nested throwable: (java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver)); - nested throwable: (org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Failed to register driver for: oracle.jdbc.driver.OracleDriver; - nested throwable: (java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver)
正如我所提到的,代码在运行时有效,所以我知道ojdbc6.jar位于$ {jboss.dir} / server / default / lib中。但是为了确定,我尝试将其添加到构建路径中,并且我在Eclipse中尝试了“订单和导出”,但都无济于事。我的想法已经不多了。如果我错过了什么,请告诉我。
答案 0 :(得分:0)
这是一种解决方法,但它现在可以使用。在maven-surefire-plugin中,我添加了以下行。
<additionalClasspathElement>lib/ojdb6.jar</additionalClasspathElement>
我还为DAO对象创建了一个测试构造函数,因为数据源的创建是在构造函数中完成的,而Mockito并没有覆盖它。所有这些都有助于发现测试可能从未在第一时间起作用。 :)
为了帮助任何在这里遇到障碍的人,在bootstrap中,它不允许你将InitialContext中的任何东西绑定到全局范围。即。
InitialContext ctx = new InitialContext();
ctx.createSubcontext( "jdbc/theDS" ); //Does not work
通过互联网搜索,嵌入式jboss只知道环境范围。