web-dev-qa-db-ja.com

SpringとMavenを使用したテスト:applicationContext

その質問は世界として古く見えますが、私はまだ解決策を見つけることができません。

私は簡単なテストを実行しようとしています:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/applicationContext.xml", "/PersonsPopulateTest-context.xml"})
@Transactional
public class PersonsPopulateTest {

ファイルは次の場所にあります。

src
   main
      resources
           applicationContext.xml

そして

src        
   test
      resources
          PersonsPopulateTest-context.xml 

したがって、これらのファイルをビルドした後はtarget/classesおよびtarget/test-classesにあります

しかし、mvn testコマンドはまだ言っています:ApplicationContextのロードに失敗しました

公式ドキュメントの内容:

@RunWith(SpringJUnit4ClassRunner.class)
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml"
// in the root of the classpath
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"})
public class MyTest {
    // class body...
}

どこで私は間違えましたか?

おかげで、Vlaidimir

更新。 surefire-reports:

Java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.Java:157)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.Java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.Java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.Java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.Java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.Java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.Java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.Java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.Java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.Java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.Java:174)
at org.Apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.Java:53)
at org.Apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.Java:123)
at org.Apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.Java:104)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at org.Apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.Java:164)
at org.Apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.Java:110)
at org.Apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.Java:175)
at org.Apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.Java:107)
at org.Apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.Java:68)
Caused by: Java.lang.IllegalArgumentException: Can not load an ApplicationContext with a NULL 'contextLoader'. Consider annotating your test class with @ContextConfiguration.
at org.springframework.util.Assert.notNull(Assert.Java:112)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.Java:117)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.Java:148)
... 30 more
33

Mavenにはmain/resourcesのXMLファイルが含まれていなかったと思います。

Pom.xmlに何を含めるかを明示的に指定することができます。

次の構成が機能しているかどうかを教えてください:

    <!-- Add this directly after the <build>-opening tag -->
    <resources>
        <resource>
            <filtering>true</filtering>
            <directory>src/test/resources</directory>
            <includes>
                <include>**/*.properties</include>
            </includes>
            <excludes>
                <exclude>**/*local.properties</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

これは私があなたの場合に使用するものです。含めるプロパティファイルがない場合は、これを編集できます。

10

私のテストコンテキストファイルはsrc\test\resources\springフォルダーの下にあります。私は何とかコンテキストをロードすることができました

@ContextConfiguration(locations={"classpath:**/test-context.xml"})

しかし、src\main\resources\springフォルダーの下にあるapplication-context.xmlへの参照(test-context.xml)

テストクラスにClassPathXmlApplicationContextを作成して、アプリケーションコンテキストを読み込むことができました。

ClassPathXmlApplicationContext appContext=new ClassPathXmlApplicationContext(new String[]{"classpath:spring/application-context.xml","classpath:spring/model-context.xml"});

これが他の問題に役立つのか、それとも何か問題を引き起こす可能性があるのか​​教えてください。

9

ベストプラクティスは、PersonsPopulateTest-context.xmlをテストするためのアプリケーションコンテキストファイルをsrc/test/resourcesの下に置くことだと思います。このファイルはtarget/test-classesにコピーされ、テストクラスで次のように参照できます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:**/PersonsPopulateTest-context.xml"})
@Transactional
public class PersonsPopulateTest {

}

Src/main/resourcesの下のapplicationContext.xmlを引き続き参照する場合は、次のように含める必要があります。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/resources/applicationContext.xml"})
@Transactional
public class PersonsPopulateTest {

}

それは私のために働いた。

3
Tony Vu

アプリケーションコンテキストをクラスパスに含めて*を配置する必要があります。

@ContextConfiguration(locations = { "classpath:*/application-context.xml" })
2
borchvm
<!-- Add this directly after the <build>-opening tag in the your pom-->
            <testResources>
                <testResource>
                    <directory>src/test/resources</directory>
                    <filtering>true</filtering>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </testResource>
            </testResources>
2
Daniela

私は同じ問題に直面しました。私にとっては、テストはEclipseを介して正常に実行されていました。ただし、mvn test、それは私にエラーを与えていました:ApplicationContextのロードに失敗しました

修正:src/test/resourcesディレクトリをsurefireプラグインのクラスパスに追加しましたas-

<plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <additionalClasspathElements>
                    <additionalClasspathElement>${project.basedir}/src/test/resources</additionalClasspathElement>
                </additionalClasspathElements>      
            </configuration>

SureFireへのクラスパスの追加

それが役に立てば幸い。

1

何らかの理由で、私は同じ問題を抱えていて、JDK8の代わりにJDK6でmavenテストを実行したときに機能しました(私の場合、これはレガシーアプリケーションです)

それが誰かを助けるなら。

1
lekant

同じ問題がありました。すべてのファイルはtarget/classestarget/test-classesに正常にコピーされましたが、まだspringは見つかりませんでした。

maven-surefire-pluginおよびmaven-resources-pluginpomのバージョンを明示的に指定すると、問題はなくなりました

0

更新:実際、私の場合、問題はCompile on Saveオプションが有効になっていることです。 Netbeansを使用していますが、オプションはFor test execution onlyに設定されていました。この値は、変更されたファイルをコンパイルし、リソースを新しいファイルに置き換えます。ただし、テストリソースに加えてアプリケーションリソースを使用するため、For test execution onlytargetフォルダーに誤って生成されたリソースを生成します。

Compile on Save=For test execution onlyの変更

to Compile on Save=Disable問題を修正します。

以下のテキストも正しいですが、時々機能しません。 Netbeans IDEを再起動するまで動作していました。ただし、問題の理由の詳細は正しいため、テストを終了することを好みます。


OLD:私の状況では、appContext-test.xmlsrc/main/resourcesがあります。コードを変更して1つの単体テスト(すべてではない)を起動すると、再コンパイルされて正しく実行されます。しかし、同じユニットテストを再度起動すると、Java.lang.IllegalStateException: Failed to load ApplicationContextで失敗します。

pom.xmlを変更しました

<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/Java/resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
</build>

<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </testResource>
        <testResource>
            <directory>${project.basedir}/src/test/Java/resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
</build>

そして今、すべてが正常に動作します。

error was due to appContext-test.xmlは、次のような多くの変数を持つsrc/main/resources/my.propertiesファイルを使用します

database.url = ${database.url}
database.username = ${database.username}
database.password = ${database.password}

ビルド中に満たされます。ただし、testResourcesrc/main/resourcesをスキップすると、my.propertiestarget/classes/my.propertiesにそのまま追加されます。置換なし。もちろん、このファイルはコンテキストを壊します。

PS:${project.basedir}/を削除できます-これは私のカスタムです。

0