Spring jUnit Testing - либо не удается выполнить автоматическое подключение, либо не удается найти appContext.xml - PullRequest
1 голос
/ 27 октября 2011

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

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

... 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"}) Тогда я получаю это исключение: Не найден соответствующий компонент типа [javax.sql.DataSource] для зависимости: ожидается как минимум 1 компонент, который считается кандидатом для автоматической передачи для этой зависимости. Аннотации зависимостей: {}

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

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

EIDT 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 Ответ

2 голосов
/ 27 октября 2011

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

@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 из затмения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...