Весеннее тестирование JUnit — либо не удается выполнить автозапуск, либо не удается найти appContext.xml

#spring #junit #junit4 #spring-test

#весна #юнит #junit4 #весенний тест

Вопрос:

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

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

 ... 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
}
 

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

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

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

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

 <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
 

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

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

Комментарии:

1. Что вы пытаетесь протестировать? — мы проводим модульное тестирование наших контроллеров Spring вне контекста приложения.

2. Это проект maven, и вы используете eclipse?

3. @Ralph: Да @ Bedwyr: Потому что я хочу проверить, правильно ли работает диспетчер. Это своего рода интеграционный тест, где мне нужен контекст для

Ответ №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 не копирует ресурсы из srctestresources целевого каталога. Итак, вам нужен один инструмент или что-то, что сделает это за вас. Вы нашли один способ: запустить приложение. Второй будет запущен maven test из eclipse.

Комментарии:

1. О, извините, это произошло потому, что я не копировал это, просто опечатка. Но, похоже, что @RunWith(SpringJUnit4ClassRunner.class ) находится в конфликте с: abstracttransactionaljunit4springcontextтестами, возможно, вам следует использовать любой из них. Потому что теперь я получаю сообщение, вызванное: java.lang. Исключение IllegalArgumentException: не найдена единица сохранения с именем ‘persistenceUnitTest’, хотя у меня есть в моем persistence.xml

2. Хорошо, спасибо, но это не имеет никакого значения: @ContextConfiguration(locations = {«/META-INF/spring/applicationContext-test.xml «}) открытый класс InventoryControllerTest расширяет AbstractTransactionalJUnit4SpringContextTests { выдает исключение FileNotFoundException, если я делаю это через путь к классу *: … Я получу исключение: не найден соответствующий компонент типа [javax.sql.DataSource] для зависимости

3. Александр: вы пробовали путь так, как я рекомендовал? путь к классу, «:», без «*» и без «/»

4. И если исключение все еще происходит, пожалуйста, распечатайте полную трассировку стека

5. @Alexander: это нормально, и то, что eclipse использует его в качестве исходной папки, правильно. Является ли persistence.xml скопировано в цель?