Тестирование с помощью Spring и Maven: applicationContext

Кажется, этот вопрос старый, как мир, но я все еще не могу найти решение ...

Я пытаюсь запустить простой тест:

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

Файлы находятся по адресу:

<code>src
   main
      resources
           applicationContext.xml
</code>

а также

<code>src        
   test
      resources
          PersonsPopulateTest-context.xml 
</code>

Таким образом, после создания эти файлы вtarget/classes а такжеtarget/test-classes

Но команда тестирования mvn по-прежнему говорит: не удалось загрузить ApplicationContext

Что говорят официальные документы:

<code>@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...
}
</code>

Где я неправ?

Спасибо, Vlaidimir

ОБНОВИТЬ. Surefire-отчеты:

<code>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
</code>
 Vladimir Kishlaly11 апр. 2012 г., 12:59
добавлена трассировка стека
 Martin Röbert11 апр. 2012 г., 12:44
я думаюapplicationContext.xml должен быть расположен в вашемsrc/test/resources, AFAIK Тесты не могут получить доступ кsrc/main папки.
 axtavt11 апр. 2012 г., 12:52
@Maroe: нет, тесты могут получить доступ к основному пути к классам. Если они не могут, как они могут загружать тестируемые классы?
 axtavt11 апр. 2012 г., 12:43
Можете ли вы показать точное сообщение об ошибке с помощью stacktrace?
 Prasanna Talakanti11 апр. 2012 г., 14:33
просто сделай этоclasspath:applicationContext.xml вместо/applicationContext.xml Ваша проблема должна исчезнуть. Это будет загружать контекст приложения до тех пор, пока он находится в пути к классу времени выполнения, в этом случае размещение applicationContext.xml вsrc/test/resources или жеsrc/main/resources должно сработать

Ответы на вопрос(9)

По какой-то причине у меня возникла та же проблема, и она работала, когда я запускал maven test с JDK6 вместо JDK8 (в моем случае это устаревшее приложение)

Если это кому-нибудь поможет.

<!-- 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>

Мой тестовый контекстный файл находится подsrc\test\resources\spring папка. Мне удалось загрузить контекст с

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

Но ссылка (в test-context.xml) на application-context.xml, который находится подsrc\main\resources\spring папка не удалось

Мне удалось загрузить контекст приложения, создав ClassPathXmlApplicationContext в тестовом классе с

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

Дайте мне знать, если это поможет или может создать какие-либо другие проблемы.

 12 апр. 2012 г., 14:34
Мне удалось сослаться на application-context.xml в test-context.xml с помощью & lt; import resource = & quot; classpath *: spring / application-context.xml & quot; / & GT;

Я столкнулся с той же проблемой. Для меня тест прошел успешно через Eclipse. Тем не менее, когда я побежалmvn testДала мне ошибку:Failed to load ApplicationContext

Fix: Added the src/test/resources directory to classpath of surefire plugin 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>

Добавление classpath в SureFire

Надеюсь, поможет.

контекст вашего приложения должен быть включен в classpath и помещен *:

@ContextConfiguration(locations = { "classpath:*/application-context.xml" })
 05 апр. 2016 г., 10:45
Лучший способ найти свой XML

ОБНОВЛЕНО: На самом деле в моем случае проблема была вCompile on Save опция включена. Я использую NetBeans, и опция была установлена наFor test execution only, Это значение компилирует измененные файлы и заменяет ресурсы новыми файлами. Однако из-за использования ресурсов приложения дополнительно к ресурсам тестирования,For test execution only производит неправильно сгенерированные ресурсы вtarget папка.

измененияCompile on Save=For test execution only

вCompile on Save=Disable fixes the problem.

Текст ниже также правильный, но иногда не работает. Это работало только до тех пор, пока я не перезапустил среду IDE Netbeans. Однако детали причины проблемы верны, поэтому я предпочитаю покинуть тест.

OLD: В моей ситуации у меня естьappContext-test.xml вsrc/main/resources. When I change any code and launch one unit test (not all of them) it recompiles and correctly executed. But if I launch same unit test again it is failed with the 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 вappContext-test.xml использованияsrc/main/resources/my.properties файл с большим количеством переменных, таких как

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

которые заполняются во время сборки. Однако, если вы пропуститеsrc/main/resources вtestResource, затемmy.properties добавлен вtarget/classes/my.properties как есть, например без замены. Этот файл, конечно, нарушает контекст.

PS: вы можете удалить${project.basedir}/ - это моя обычная вещь.

Решение Вопроса

Я думаю, что Maven просто не включил XML-файл из main / resources.

Вы можете попытаться указать явно, что включать в 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>

Это то, что я использую в вашем случае. Вы можете изменить это, если у вас нет файлов свойств для включения.

 21 июн. 2016 г., 23:22
Maven включает в себя все отsrc/test/resources а такжеsrc/main/resources по умолчанию. Вы можете легко проверить эти файлы в вашей цели послеpackage, Так что, очевидно, проблема не в этом. Я полагаю, что просто неправильная контекстная декларация, на которую указывает Прасанна Талаканти.

Я думаю, что лучшая практика - это поместить файл контекста вашего приложения для тестирования PersonsPopulateTest-context.xml в src / test / resources. Этот файл будет скопирован вtarget/test-classes и вы можете сослаться на него в своем тестовом классе, как показано ниже:

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

}

Если вы все еще хотите сослаться на applicationContext.xml в каталоге src / main / resources, вы должны включить его следующим образом:

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

}

Это сработало для меня.

У меня была такая же проблема, все файлы были успешно скопированы вtarget/classes а такжеtarget/test-classes, ещеspring не мог их найти.

Проблема исчезла, когда я явно указал версии дляmaven-surefire-plugin а такжеmaven-resources-plugin вpom

 13 июн. 2014 г., 10:23
какие версии вы установили? я пытаюсь установить все версии этого плагина, но он все еще не работает

Ваш ответ на вопрос