その質問は世界として古く見えますが、私はまだ解決策を見つけることができません。
私は簡単なテストを実行しようとしています:
@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
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>
これは私があなたの場合に使用するものです。含めるプロパティファイルがない場合は、これを編集できます。
私のテストコンテキストファイルは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"});
これが他の問題に役立つのか、それとも何か問題を引き起こす可能性があるのか教えてください。
ベストプラクティスは、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 {
}
それは私のために働いた。
アプリケーションコンテキストをクラスパスに含めて*を配置する必要があります。
@ContextConfiguration(locations = { "classpath:*/application-context.xml" })
<!-- 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>
私は同じ問題に直面しました。私にとっては、テストは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>
それが役に立てば幸い。
何らかの理由で、私は同じ問題を抱えていて、JDK8の代わりにJDK6でmavenテストを実行したときに機能しました(私の場合、これはレガシーアプリケーションです)
それが誰かを助けるなら。
同じ問題がありました。すべてのファイルはtarget/classesとtarget/test-classesに正常にコピーされましたが、まだspringは見つかりませんでした。
maven-surefire-pluginおよびmaven-resources-pluginでpomのバージョンを明示的に指定すると、問題はなくなりました
更新:実際、私の場合、問題はCompile on Save
オプションが有効になっていることです。 Netbeansを使用していますが、オプションはFor test execution only
に設定されていました。この値は、変更されたファイルをコンパイルし、リソースを新しいファイルに置き換えます。ただし、テストリソースに加えてアプリケーションリソースを使用するため、For test execution only
はtarget
フォルダーに誤って生成されたリソースを生成します。
Compile on Save=For test execution only
の変更
to Compile on Save=Disable
問題を修正します。
以下のテキストも正しいですが、時々機能しません。 Netbeans IDEを再起動するまで動作していました。ただし、問題の理由の詳細は正しいため、テストを終了することを好みます。
OLD:私の状況では、appContext-test.xml
にsrc/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}
ビルド中に満たされます。ただし、testResource
でsrc/main/resources
をスキップすると、my.properties
がtarget/classes/my.properties
にそのまま追加されます。置換なし。もちろん、このファイルはコンテキストを壊します。
PS:${project.basedir}/
を削除できます-これは私のカスタムです。