springTestContextBeforeTestMethod не удалось в весеннем тесте Maven

Я пытаюсь настроить проект с помощью Spring-Test, используя TestNg в Maven. Код такой:

@ContextConfiguration(locations={"test-context.xml"})
public class AppTest extends AbstractTestNGSpringContextTests {

    @Test
    public void testApp() {
        assert true;
    }
}

Test-context.xml просто определяет bean-компонент:

<bean id="app" class="org.sonatype.mavenbook.simple.App"/>

У меня возникла ошибка Failed to load ApplicationContext при запуске mvn test из командной строки, кажется, не удается найти файл test-context.xml; однако я могу заставить его правильно работать внутри Eclipse (с помощью плагина TestNg).

Итак, test-context.xml находится в src / test / resources /, как мне указать это в pom.xml, чтобы команда mvn test работала? Спасибо,

ОБНОВИТЬ:

Спасибо за ответ. Ошибка «Невозможно загрузить файл контекста» была вызвана тем, что я переместил файл в другое место, так как я думал, что проблема была в пути к классам. Теперь я обнаружил, что файл контекста загружен из вывода Maven, но тест не удался:

Running TestSuite
May 25, 2010 9:55:13 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [test-context.xml]
May 25, 2010 9:55:13 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.GenericApplicationContext@171bbc9: display name [org.springframework.context.support.GenericApplicationContext@171bbc9]; startup date [Tue May 25 09:55:13 PDT 2010]; root of context hierarchy
May 25, 2010 9:55:13 AM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
INFO: Bean factory for application context [org.springframework.context.support.GenericApplicationContext@171bbc9]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1df8b99
May 25, 2010 9:55:13 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1df8b99: defining beans [app,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor]; root of factory hierarchy
Tests run: 3, Failures: 2, Errors: 0, Skipped: 1, Time elapsed: 0.63 sec <<< FAILURE!

Results :

Failed tests: 
  springTestContextBeforeTestMethod(org.sonatype.mavenbook.simple.AppTest)
  springTestContextAfterTestMethod(org.sonatype.mavenbook.simple.AppTest)

Tests run: 3, Failures: 2, Errors: 0, Skipped: 1

Если я использую Spring-test версии 3.0.2.RELEASE, ошибка становится:

org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance() is depending on nonexistent method null

Вот структура проекта:

simple
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    `-- test
        |-- java
        `-- resources
            |-- test-context.xml
            `-- testng.xml

testng.xml:

<suite name="Suite" parallel="false">
  <test name="Test">
    <classes>
      <class name="org.sonatype.mavenbook.simple.AppTest"/>
    </classes>
  </test>
</suite>

test-context.xml:

 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
    default-lazy-init="true">
    <bean id="app" class="org.sonatype.mavenbook.simple.App"/>
 </beans>

В pom.xml я добавляю артефакты testng, spring и spring-test, а также плагин:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.1</version>
  <classifier>jdk15</classifier>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring</artifactId>
  <version>2.5.6</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId> 
    <version>2.5.6</version> 
    <scope>test</scope> 
</dependency>

<build>
<finalName>simple</finalName>
<plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>   
      <suiteXmlFiles>
        <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
      </suiteXmlFiles>
    </configuration>
  </plugin>
</plugins>

Basically, I replaced 'A Simple Maven Project' Junit with TestNg, hope it works.

ОБНОВИТЬ:

Я думаю, что у меня проблема (до сих пор не знаю почему) - всякий раз, когда я расширяю AbstractTestNGSpringContextTests или AbstractTransactionalTestNGSpringContextTests, тест завершается с ошибкой:

Failed tests:
  springTestContextBeforeTestMethod(org.sonatype.mavenbook.simple.AppTest)
  springTestContextAfterTestMethod(org.sonatype.mavenbook.simple.AppTest)

Итак, в конце концов ошибка исчезла, когда я переопределил два метода. Я не думаю, что это правильный путь, не нашел много информации в документации по весеннему тесту. Если вы знакомы с фреймворком Spring Test, пожалуйста, пролейте немного света на это.


person joejax    schedule 25.05.2010    source источник


Ответы (3)


Добавьте путь к классам перед именем файла. Затем он будет искать в корневой папке всех исходных папок.

@ContextConfiguration(locations={"classpath:test-context.xml"})
person Espen    schedule 25.05.2010
comment
Я не понимаю, почему вы должны добавлять classpath:, и тест, и test-context.xml находятся в одном месте (target/test-classes), какие еще папки источников следует искать? - person Pascal Thivent; 25.05.2010
comment
Я также понимаю, что классы и ресурсы копируются в целевую папку. Я просто попытался ответить, как вы можете быть уверены, что контейнер Spring будет сканировать после контекста в корневой папке. Без classpath: Spring начнет сканирование пакета с тестовым классом. Надеюсь, это проясняет то, что я пытался сказать. - person Espen; 25.05.2010
comment
Хорошо, теперь понятно, спасибо за разъяснения. Но мне интересно, почему он работает в Eclipse без classspath: - person Pascal Thivent; 25.05.2010
comment
Я не совсем уверен, как Maven и TestNg справляются с этой задачей. Я использую Ant и JUnit. Но мой совет по крайней мере устранит одну неуверенность в том, где Spring будет искать контекст. - person Espen; 25.05.2010
comment
Собственно, я не думаю, что это дает ответ на вопрос. - person Pascal Thivent; 26.05.2010

У меня была такая же проблема с Spring 2.5.6. Решил с помощью testng 5.5.

Версия, которую я использовал (testng 5.1), имела такое же поведение: тест отлично работает внутри Eclipse, но не может найти контекст из командной строки.

При замене testng на testng 2.5.6 проблема исчезла. Действует только в Spring 2.5.6.

person Pablo Alcaraz    schedule 17.07.2010

Снимок в темноте, поскольку я не видел вашего Java-кода: вы уверены, что используете @BeforeMethod, а не @BeforeTest?

person Cedric Beust    schedule 26.05.2010
comment
Class App - это просто фиктивный класс. Тестовый Java-код был показан в начале этого сообщения: @ContextConfiguration (location = {/ test-context.xml}) открытый класс AppTest расширяет AbstractTestNGSpringContextTests {@Test public void testApp () {assert true; }} Есть только один метод @Test, больше ничего. - person joejax; 27.05.2010