14

数十のBeanを実装する比較的小さなJavaライブラリがあります(データベースやGUIはありません)。他のJavaプロジェクトが自分のBeanを自分のものに注入するために使用するSpringBean構成ファイルを作成しました。

私は今、Spring Testを使用して、これらのBeanの一部を(単にインスタンス化するのではなく)junitテストクラスに注入しようとしているのは初めてです。

私はこれを、一部はSpring Testを学習するために、一部は他の人に提供するのと同じBean構成ファイルを使用するようにテストに強制するために行っています。

Springのドキュメントには、Springに付属の「TestContext」クラスを使用してアプリケーションコンテキストを作成する必要があると書かれています。これは、テストクラスの@ContextConfigurationアノテーションを介して参照するSpringXMLファイルで行う必要があると思います。

@ContextConfiguration({"/test-applicationContext.xml"})

ただし、ファイルに何を入れるかについてのヒントはありません。

Eclipse内からテストを実行しようとすると、「アプリケーションコンテキストのロードに失敗しました」というエラーが表示されます。もちろんです。

アップデート:

test-applicationContext.xmlは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <description>Holds application context for testing of the domain module.</description>

    <!-- Imports the uuid generator bean definitions -->
    <import resource="resources/domain-uuid.xml"/>  
</beans>

私のプロジェクトディレクトリは次のようなものです。

domain/
   src/
      main/
         java/
         resources/
      test/
         java/
         resources/ (location of test-applicationContext.xml)

楽しみのために、「mvn clean test」を介してmvnコマンドラインからビルドしようとしましたが、次のエラーが発生しました。これは私の本当の問題である可能性があります。

package org.springframework.test.context does not exist

package org.springframework.test.context.junit4 does not exist

cannot find symbol
symbol: class ContextConfiguration
@ContextConfiguration({"/resources/test-applicationContext.xml"})

cannot find symbol
symbol: class SpringJUnit4ClassRunner
@RunWith(SpringJUnit4ClassRunner.class)
4

2 に答える 2

12

アプリのコンテキストファイルに何を入れるか。TestContext Frameworkが機能する方法は、統合テストのコンテキストでアプリの配線を再利用できるようにすることです。したがって、ほとんどの場合、アプリのコンテキスト構成ファイル内に配置するテストに特別なことは何もありません。コントローラーのアプリにサービスBeanの依存関係がある場合は、統合テストにも依存関係があります。DAOのアプリにSessionFactoryがある場合は、統合テストでも同じです。そうすれば、統合テストを作成するときに、すべてのものを再度配線する必要がありません。とてもかっこいい。

頭に浮かぶ例外が少なくとも1つあるので、上記の大部分について述べました。通常、アプリはJNDIを使用してデータソースを検索しますが、統合テスト(少なくともコンテナー外の統合テスト)では、通常、JNDI環境を利用できません。BasicDataSourceしたがって、通常、データソースBeanの作成を別のファイルに分離し、ライブアプリにはJNDIバージョンを使用し、統合テストには非JNDIバージョンを使用する必要があります(たとえば、ストレートを作成するだけです)。前者の例を次に示します。

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/>

後者の例を次に示します。

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close"
    p:driverClassName="${dataSource.driverClassName}"
    p:url="${dataSource.url}"
    p:username="${dataSource.username}"
    p:password="${dataSource.password}" />

これらは別々のファイルに入れられます。1つ目はbeans-datasource.xml通常のアプリの使用に使用され、2つ目はbeans-datasource-it.xml統合テストに使用される場合があります。通常のアプリの使用と統合テストに共通する構成(つまり、ほとんどの場合、Bean構成の大部分)は、共通の構成ファイルに含める必要があります。

jdbcまた、Spring 3では、HSQLDBデータベースやDerbyデータベースなどの組み込みデータベースを作成できる新しい名前空間が導入されています。次のようになります。

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:hsql/schema.sql" />
    <jdbc:script location="classpath:hsql/test-data.sql" />
</jdbc:embedded-database>

これを使用する場合は、上記の構成が置き換えBasicDataSourceられます。

エラーが発生している理由。表示されているエラーは@ContextConfiguration、アプリコンテキストファイルがクラスパス上にある必要があることを値が暗黙的に示しているために発生しています。重要:/resourcesピースを取り外します。それがMavenの内部です。JARまたはWARをビルドするときに、ディレクトリの内容resourcesをそれ自体ではなくクラスパスにコピーしますresources。それは役立つはずです。

編集:

「シンボルが見つかりません」エラーに対処するには、テストの依存関係をMavenPOMに追加する必要があります。これは、JUnitとSpring Testモジュールにもなり、両方とも<scope>test</scope>。さらに、Mockitoのようなモックフレームワークを使用している場合は、その依存関係(テストスコープを使用)もPOMに追加する必要があります。それを試して、何が起こったのかを報告してください。

于 2010-05-19T04:54:28.220 に答える
9

src / test / resourcesのすぐ下を見つけるには、次のように変更します。

@ContextConfiguration({"classpath:/test-applicationContext.xml"})

何も指定しない場合は、テストクラスと同じパッケージでSpringを検索します。

于 2010-05-24T09:33:46.457 に答える