#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 скопировано в цель?