Spring jUnit Testing - либо не может автоматически подключаться, либо не может найти appContext.xml

Я тестирую весеннее приложение atm. Во-первых, проблема в том, что если я не запустил приложение один раз на сервере, все юнит-тесты терпят неудачу. Если я сначала запускаю приложение на сервере (и останавливаю его), мои модульные тесты работают.

Без запуска сервера я получаю следующую ошибку:

... java.io.FileNotFoundException: class path resource [META-INF/spring/applicationContext-test.xml] cannot be opened because it does not exist

Мой модульный тест определяется следующим образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/META-INF/spring/applicationContext-test.xml" })
@TransactionConfiguration
@Transactional
public class InventoryControllerTest extends AbstractTransactionalJUnit4SpringContextTests {

    private MockHttpServletRequest request;
    private MockHttpServletResponse response;

    private AnnotationMethodHandlerAdapter handlerAdapter;

    @Before
    public void setUp() throws Exception {
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
        handlerAdapter = applicationContext
            .getBean(AnnotationMethodHandlerAdapter.class);
}
    //... tests
}

Итак, как я уже сказал, если я запускал приложение один раз, все работает нормально.

Поэтому я изменил расположение конфигурации на location = { "classpath/META-INF/spring/applicationContext-test.xml" }) Но без усилий, то же исключение, что и выше.

Единственный способ продвинуться дальше - это местоположение: location = { "classpath*:applicationContext-test.xml" }) Затем я получаю это исключение: для зависимости не найден соответствующий bean-компонент типа [javax.sql.DataSource]: ожидается не менее 1 bean-компонент, который квалифицируется как кандидат автоподключения для этой зависимости. Аннотации зависимостей: {}

Но это сбивает с толку, потому что у меня определенно есть источник данных в моем тестовом файле контекста:

<bean class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" id="dataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:testdb;sql.syntax_ora=true" />
    <property name="username" value="some" />
    <property name="password" value="some" />
</bean>

ЭИДТ 2

Узнав, что проблема заключается в RunWith(...) и одновременном расширении класса Spring и удалении всех подстановочных знаков из пути к местоположению. Я получаю это исключение:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [META-INF/spring/applicationContext-test.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/spring/applicationContext-test.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No persistence unit with name 'persistenceUnitTest' found
... 24 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/spring/applicationContext-test.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No persistence unit with name 'persistenceUnitTest' found
... 40 more
Caused by: java.lang.IllegalArgumentException: No persistence unit with name 'persistenceUnitTest' found)
... 47 more

Я был бы очень признателен за любую помощь!

заранее спасибо


person Alexander    schedule 27.10.2011    source источник
comment
Что вы пытаетесь протестировать? - мы проводим модульное тестирование наших контроллеров Spring вне контекста приложения.   -  person blank    schedule 27.10.2011
comment
Это проект maven, и вы используете eclipse?   -  person Ralph    schedule 27.10.2011
comment
@Ralph: Да @ Bedwyr: Потому что я хочу проверить, правильно ли работает диспетчер. Это своего рода тест интеграции, где мне нужен контекст для   -  person Alexander    schedule 27.10.2011


Ответы (1)


Между classpath и путем должен быть :, а путь не должен начинаться с /. Таким образом, правильный синтаксис будет следующим:

@ContextConfiguration(locations = { "classpath:META-INF/spring/applicationContext-test.xml" })

или немного более короткая форма

@ContextConfiguration("classpath:META-INF/spring/applicationContext-test.xml")

Другая проблема, обнаруженная вами самостоятельно, заключается в том, что вы должны использовать @ContextConfiguration ИЛИ AbstractTransactionalJUnit4SpringContextTests. Вот примечание о кодировании из Java Doc от AbstractTransactonalJUnit4SpringContextTests

> Примечание: этот класс служит только для удобства расширения. Если вы не хотите, чтобы ваши тестовые классы были привязаны к специфичной для Spring иерархии классов, вы можете настроить свои собственные пользовательские тестовые классы, используя {@link SpringJUnit4ClassRunner}, {@link ContextConfiguration @ContextConfiguration}, {@link TestExecutionListeners @TestExecutionListeners }, {@link Transactional @Transactional} и т. д.


Начальная проблема: Eclipse не копирует ресурсы из src\test\resources в целевой каталог. Итак, вам нужен один инструмент или что-то, что сделает это за вас. Вы нашли один способ: запуск приложения. Второй будет запускать maven test из eclipse.

person Ralph    schedule 27.10.2011
comment
О, извините, это пришло, потому что я не скопировал это, просто опечатка. Но кажется, что @RunWith(SpringJUnit4ClassRunner.class) конфликтует с: AbstractTransactionalJUnit4SpringContextTests. Возможно, вам следует использовать любой из них. Потому что теперь я получаю сообщение об ошибке, вызванное: java.lang.IllegalArgumentException: не найден модуль сохранения с именем «persistenceUnitTest», хотя он есть в моем файле persistence.xml. - person Alexander; 27.10.2011
comment
Хорошо, спасибо, но это не имеет никакого значения: @ContextConfiguration(locations = {/META-INF/spring/applicationContext-test.xml}) public class InventoryControllerTest extends AbstractTransactionalJUnit4SpringContextTests { генерирует исключение FileNotFoundException, если я делаю это через путь к классам*: ... Я получаю исключение: для зависимости не найден соответствующий bean-компонент типа [javax.sql.DataSource] - person Alexander; 27.10.2011
comment
Александр: Вы пробовали путь так, как я рекомендовал? путь к классам, :, без * и без / - person Ralph; 27.10.2011
comment
И если исключение все еще происходит, распечатайте полную трассировку стека - person Ralph; 27.10.2011
comment
Да, я пробовал путь к классам: META-INF/spring/applicationContext-test.xml, и он работает, но затем я получаю исключение, упомянутое в моем первом комментарии: java.lang.IllegalArgumentException: не найден блок сохранения с именем «persistenceUnitTest», хотя у меня есть XML-файл сохранения с указанным persistenceUnitTest - person Alexander; 27.10.2011
comment
Где находится ваш файл persistence.xml? (полный путь от корня проекта) - person Ralph; 27.10.2011
comment
Он находится в src/main/resources/META-INF/persistence.xml, но src/main/resources объявлен как исходная папка в eclipse... - person Alexander; 27.10.2011
comment
@Alexander: это нормально, и затмение принимает его как исходную папку правильно. Скопирован ли файл persistence.xml в цель? - person Ralph; 27.10.2011
comment
Хм, я не знаю, где именно это проверить, но кажется, потому что работает нормально. Не могу найти копию в моем pom.xml... - person Alexander; 27.10.2011
comment
Это очень запутанно, добавление файла persistence.xml в папку META-INF/spring/ решило бы проблему, но я действительно хочу знать, как решить проблему, не перемещая файл persistence.xml в другой каталог. Кажется, что-то не получается на этапе копирования файла... - person Alexander; 27.10.2011
comment
@Alexander: пожалуйста, опубликуйте объявление фабрики менеджера сущностей. - person Ralph; 27.10.2011
comment
Хорошо, я думаю, это работает. После удаления всех папок в цели и выполнения чистой сборки в eclipse проходят модульные тесты (в eclipse и в консоли через mvn test). Большое спасибо за вашу помощь, Ральф! - person Alexander; 27.10.2011