Как создать TestContext для Spring Test? - PullRequest
14 голосов
/ 19 мая 2010

У меня относительно небольшая библиотека Java, которая реализует несколько десятков компонентов (без базы данных или графического интерфейса). Я создал файл конфигурации Spring Bean, который другие Java-проекты используют для добавления моих компонентов в свои вещи.

Я впервые пытаюсь использовать Spring Test для внедрения некоторых из этих bean-компонентов в мои тестовые классы junit (а не просто для их создания).

Я делаю это отчасти для изучения Spring Test и отчасти для того, чтобы заставить тесты использовать тот же файл конфигурации бина, который я предоставляю другим.

В документации 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 clean test", и я получил следующие ошибки, которые могут быть моей настоящей проблемой:

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)

Ответы [ 2 ]

10 голосов
/ 19 мая 2010

Что поместить в файл контекста приложения. Принцип работы 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. Это должно помочь.

EDIT:

Чтобы устранить ошибки «символ не найден», вам необходимо добавить свои тестовые зависимости в POM Maven. Это будет также JUnit и модуль Spring Test, оба с <scope>test</scope>. Кроме того, если вы используете фиктивный фреймворк, такой как Mockito, вам нужно будет добавить эту зависимость (с тестовой областью) и к вашему POM. Попробуйте и сообщите, пожалуйста, о том, что происходит.

8 голосов
/ 24 мая 2010

Чтобы найти его непосредственно в src / test / resources, измените его на:

@ContextConfiguration({"classpath:/test-applicationContext.xml"})

Если вы ничего не указали, тогда Spring выполнит поиск в том же пакете, что и тестовый класс.

...