Как создать TestContext для Spring Test?

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

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

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

В документации Spring говорится, что мне нужно создать контекст приложения, используя класс TestContext, который поставляется с Spring. Я считаю, что это должно быть сделано в XML файле Spring, который я ссылаюсь через аннотацию @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)

Ответы

Ответ 1

Что добавить в контекстный файл приложения.. Принцип работы TestContext Framework заключается в том, что он позволяет повторно использовать проводку приложений в контексте ваших интеграционных тестов. Поэтому, по большей части, нет ничего особенного в тестах, которые вы разместили бы в своих конфигурационных файлах контекста приложения. Если у вашего контроллера есть зависимость службы bean в вашем приложении, тогда это будет и в вашем интеграционном тесте. Если ваш DAO имеет SessionFactory в вашем приложении, то это же для вашего теста интеграции. Таким образом, вы не должны подключать все эти вещи снова, когда вы пишете интеграционные тесты. Очень круто.

Я сказал по большей части выше, потому что на ум приходит хотя бы одно исключение. Обычно ваше приложение будет использовать JNDI для поиска источника данных, но в тесте интеграции (по крайней мере, в тесте интеграции с контейнером) обычно нет среды JNDI. Поэтому вы обычно должны изолировать создание DataSource bean к отдельному файлу и использовать версию 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. Это внутренности Мавена; когда он создает JAR или WAR, он копирует содержимое каталога resources в ваш путь к классу, а не resources. Это должно помочь.

EDIT:

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

Ответ 2

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

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

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