web-dev-qa-db-ja.com

Spring TestのTestContextを作成するにはどうすればよいですか?

私は比較的小さなJavaライブラリを持っており、数十のBeanを実装しています(データベースやGUIはありません)。他のJavaプロジェクトの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)
14
HDave

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

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

<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構成の大部分)は、共通の構成ファイルに含める必要があります。

また、Spring3では新しいjdbc名前空間が導入されており、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ディレクトリのcontentsを、resources自体ではなくクラスパスにコピーします。それは役立つはずです。

編集:

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

11
Willie Wheeler

Src/test/resourcesの直下で見つけるには、次のように変更します。

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

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

9
Espen