У меня есть относительно небольшая библиотека Java, которая реализует несколько дюжин бобов (никакая база данных или GUI). Я создал Бобовый конфигурационный файл Spring что другое использование проектов Java для введения моих бобов в их материал.
Я теперь впервые пытаюсь использовать Тест Spring для введения некоторых из этих бобов в мои тестовые классы junit (вместо того, чтобы просто инстанцировать их).
Я делаю это частично, чтобы изучить Тест Spring и частично вынудить тесты использовать тот же бобовый конфигурационный файл, я предусматриваю других.
В Spring документация, говорит, что я должен создать контекст приложения с помощью класса "TestContext", который идет с Spring. Я полагаю, что это должно быть сделано в пружинном XML-файле, на который я ссылаюсь с помощью @ContextConfiguration аннотации на мой тестовый класс.
@ContextConfiguration({"/test-applicationContext.xml"})
Однако нет никакой подсказки относительно того, что вставить файл!
Когда я иду для запущения моих тестов из Eclipse это, ошибкам, говоря "не удалось загрузить Контекст Приложения"...., конечно.
Обновление:
Вот test-applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<description>Holds application context for testing of the domain module.</description>
<!-- Imports the uuid generator bean definitions -->
<import resource="resources/domain-uuid.xml"/>
</beans>
Мой каталог проекта похож на это:
domain/
src/
main/
java/
resources/
test/
java/
resources/ (location of test-applicationContext.xml)
Только для забавы я также пытался создать из mvn командной строки через "mvn чистый тест", и я получил следующие ошибки, которые могут быть моей настоящей проблемой:
package org.springframework.test.context does not exist
package org.springframework.test.context.junit4 does not exist
cannot find symbol
symbol: class ContextConfiguration
@ContextConfiguration({"/resources/test-applicationContext.xml"})
cannot find symbol
symbol: class SpringJUnit4ClassRunner
@RunWith(SpringJUnit4ClassRunner.class)
Что поместить в файл контекста приложения. Принцип работы TestContext Framework заключается в том, что он позволяет повторно использовать соединение приложений в контексте ваших интеграционных тестов. Итак, по большей части нет ничего особенного в тестах, которые вы бы поместили в конфигурационные файлы контекста вашего приложения. Если у вашего контроллера есть зависимость сервисного компонента в вашем приложении, то она будет и в вашем интеграционном тесте.Если в вашем приложении DAO есть SessionFactory, то же самое и для вашего интеграционного теста. Таким образом, вам не придется заново подключать все эти штуки при написании интеграционных тестов. Очень круто.
Я сказал по большей части выше, потому что на ум приходит по крайней мере одно исключение. Обычно ваше приложение будет использовать JNDI для поиска источника данных, но в тесте интеграции (по крайней мере, тест интеграции вне контейнера) у вас обычно не будет доступной среды JNDI. Таким образом, вы обычно должны изолировать создание bean-компонента DataSource в отдельном файле и использовать версию JNDI для вашего живого приложения и версию, отличную от JNDI (например, просто создать прямой BasicDataSource
, скажем) для вашего интеграционного теста. Вот пример первого:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/>
и вот пример последнего:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${dataSource.driverClassName}"
p:url="${dataSource.url}"
p:username="${dataSource.username}"
p:password="${dataSource.password}" />
Они будут находиться в отдельных файлах. Первый может быть в beans-datasource.xml
для обычного использования приложения, а второй в beans-datasource-it.xml
для интеграционных тестов. Конфигурация, которая является общей для обычного использования приложений и тестов интеграции (то есть, подавляющее большинство конфигурации вашего bean-компонента в большинстве случаев), должна быть в общем файле или файлах конфигурации.
Кроме того, Spring 3 представляет новое пространство имен jdbc
, которое позволяет создавать встроенную базу данных, такую как база данных HSQLDB или база данных Derby и т. Д. Это выглядит так:
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:hsql/schema.sql" />
<jdbc:script location="classpath:hsql/test-data.sql" />
</jdbc:embedded-database>
Это заменит Конфигурация BasicDataSource
, описанная выше, если вы хотите ее использовать.
Почему возникает ошибка. Вы видите ошибку, потому что ваше значение @ContextConfiguration
неявно указывает, что файл контекста приложения должен находиться в пути к классам. ВАЖНО: Удалите часть / resources
. Это внутренности Maven; когда он создает ваш JAR или WAR, он копирует содержимое каталога resources
в ваш путь к классам, а не сам resources
. Это должно помочь.
РЕДАКТИРОВАТЬ:
Чтобы устранить ошибку «символ не найден», вам необходимо добавить тестовые зависимости в свой Maven POM. Это будет JUnit и модуль Spring Test, оба с
. Кроме того, если вы используете макетную структуру, такую как Mockito, вам также необходимо добавить эту зависимость (с областью тестирования) в свой POM. Попробуйте это и, пожалуйста, доложите о том, что происходит.
Чтобы найти его прямо в src / test / resources, измените его на:
@ContextConfiguration({"classpath:/test-applicationContext.xml"})
Если вы ничего не указываете, то Spring выполняет поиск в том же пакете, что и тестовый класс .