0

私はこの問題に数日間取り組んできましたが、それは私を夢中にさせています。

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で「注文とエクスポート」を試しましたが、まったく役に立ちませんでした。アイデアが足りなくなっています。私が何かを逃したかどうか私に知らせてください。

4

1 に答える 1

0

これは一種の回避策ですが、今のところ機能します。maven-surefire-plugin に次の行を追加しました。

<additionalClasspathElement>lib/ojdb6.jar</additionalClasspathElement>

データソースの作成はコンストラクターで行われ、Mockito はそれをオーバーライドしないため、DAO オブジェクトのテスト コンストラクターも作成しました。テストがそもそも機能しなかった可能性があることを確認するために、すべての作業が行われました。:)

ここでつまずいた人を助けるために、ブートストラップでは、InitialContext 内の何かをグローバル スコープにバインドすることはできません。IE

InitialContext ctx = new InitialContext();
ctx.createSubcontext( "jdbc/theDS" ); //Does not work

私がインターネットを精査して集めたものから、組み込みの jboss は環境の範囲しか認識していません。

于 2013-03-07T19:21:35.610 に答える