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

У меня есть относительно небольшая библиотека 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)
14
задан ROMANIA_engineer 25 December 2017 в 18:06
поделиться

2 ответа

Что поместить в файл контекста приложения. Принцип работы 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, оба с test . Кроме того, если вы используете макетную структуру, такую ​​как Mockito, вам также необходимо добавить эту зависимость (с областью тестирования) в свой POM. Попробуйте это и, пожалуйста, доложите о том, что происходит.

11
ответ дан 1 December 2019 в 13:08
поделиться

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

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

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

9
ответ дан 1 December 2019 в 13:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: