Пример Spring/Hibernate/Junit тестирования ДАО против HSQLDB

Я работаю над попыткой реализовать тест JUnit для проверки функциональности ДАО. (ДАО Будет создавать/читать основной объект/связь между таблицами).

Затруднения, которые я испытываю, являются персистентностью ДАО (для нетестового кода), завершается через внутреннее решение с помощью Spring/Быть в спящем режиме, который устраняет обычное *.hbm.xmlшаблоны, которые большинство примеров я нашел, содержат.

Из-за этого я испытываю некоторые затруднения при понимании, как установить тест JUnit для реализации ДАО для создавания/читавшего (просто очень простая функциональность) к HSQLDB в оперативной памяти. Я нашел несколько примеров, но использование внутренних средств персистентности, я не могу расширить некоторые классы шоу в качестве примера (я, может казаться, не получаю настройки application-context.xml правильно).

Кто-либо может предложить какие-либо проекты/примеры, я мог смотреть на (или какая-либо документация) к далее моему пониманию лучшего способа реализовать эту тестовую функциональность? Я чувствую, что это должно быть действительно просто, но я продолжаю сталкиваться с проблемами, реализовывая примеры, которые я нашел.

править:

Вот мое решение для лучшей удобочитаемости для любого, кому нужна рука, получая вещи, идущие:

  • Мой TestClass:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContextTest-Example.xml")
    @Transactional
    public class ExampleDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
        @Resource(name = "sessionFactory")
        private SessionFactory exampleSessionFactory;
    
        @Resource(name = "exampleDao")
        private ExampleDao exampleDao;
    
  • Мой applicationContext.xml файл:

    <!-- List of Daos to be tested -->
    <bean id="exampleDao" class="org.myExample.ExampleDao"/>
    
    <!-- Datasource -->
    <bean id="example_dataSource"
          class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem:ExampleTest"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>
    
    <!-- Session Factory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="example_dataSource"/>
        <property name="annotatedClasses">
            <list>
                <value>org.myExample.ExampleClass</value>
            </list>
        </property>
        <property name="hibernateProperties">
            .... left to user to choose properties
        </property>
    </bean>
    
17
задан AdrieanKhisbe 28 December 2014 в 13:48
поделиться

3 ответа

Spring 3 предлагает новое пространство имен jdbc , которое включает поддержку встроенных баз данных, включая HSQLDB. Так что об этой части позаботимся.

Мне интересно, каким может быть «внутреннее решение». Вы можете использовать аннотации (аннотации JPA или Hibernate) для ORM ваших доменных объектов, так зачем вам «внутреннее решение»? Например: [

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    p:dataSource-ref="dataSource"
    p:packagesToScan="myapp.model" />

] Что касается реализации теста, используйте Spring TestContext Framework. Тест может выглядеть так (я снова предполагаю Spring 3 ниже, хотя он должен работать в Spring 2.5, просто изменив @Inject на @Autowired):

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
    "/beans-datasource-it.xml",
    "/beans-dao.xml",
    "/beans-service.xml",
    "/beans-web.xml" })
@Transactional
public class ContactControllerIT {
    @Inject private ContactController controller;

    ... setUp() and tearDown() ...

    @Test
    public void testGetContact() {
        String viewName = controller.getContact(request, 1L, model);

        ... assertions ...
    }
}

Вы поместите встроенную базу данных в beans-datasource -it.xml , например.(«он» здесь означает интеграционный тест, а файлы находятся в пути к классам.) Контроллер в этом примере находится в beans-web.xml и будет автоматически подключен к ContactController ] поле.

Это всего лишь набросок того, что нужно делать, но, надеюсь, этого достаточно, чтобы вы начали.

5
ответ дан 30 November 2019 в 14:36
поделиться

Суть спящего режима - это SessionFactory - ваше внутреннее решение, скорее всего, каким-то образом создаст один из них. Узнайте, как это сделать, и затем таким же образом добавьте компонент для его создания в контексте тестового приложения (или, если возможно, используя собственный код, который используется во время выполнения). Вам может потребоваться создать собственный FactoryBean для создания экземпляра. (Используйте AbstractFactoryBean в качестве базового класса.)

Когда это будет сделано, большинство примеров, использующих LocalSessionFactoryBean, можно перенести в вашу ситуацию - вместо использования LocalsessionFactoryBean используйте свой собственный фабричный компонент.

(Если вы еще этого не сделали, посмотрите раздел Тестирование в справочнике Spring - он упрощает тестирование с помощью Spring и внедрение тестов с bean-компонентами из контекста.)

1
ответ дан 30 November 2019 в 14:36
поделиться

См. Здесь . Он предполагает maven2 в качестве инструмента сборки, но вы можете легко использовать что угодно.

2
ответ дан 30 November 2019 в 14:36
поделиться
Другие вопросы по тегам:

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