Spring / Hibernate / Junit пример тестирования DAO против HSQLDB - PullRequest
17 голосов
/ 19 мая 2010

Я пытаюсь реализовать тест JUnit для проверки работоспособности DAO. (DAO создаст / прочитает базовое отношение объект / таблица).

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

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

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

редактирование:

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

  • My 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>
    

Ответы [ 5 ]

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

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

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

<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.

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

2 голосов
/ 22 мая 2011

Недавно я реализовал аналогичное решение в некоторых моих кодах, используя Hibernate , Spring и HSQLDB.

Стоит отметить, что AbstractTransactionalJUnit4SpringContextTests теперь устарела - но все еще довольно просто протестировать - большинство деталей я расскажу здесь: http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html

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

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

1 голос
/ 19 мая 2010

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

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

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

0 голосов
/ 03 июля 2013

Мой контекст приложения выглядит немного иначе

<beans:bean class="org.apache.commons.dbcp.BasicDataSource" id="HSQL_DS">
    <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <beans:property name="url" value="jdbc:hsqldb:mem:Test"/>
    <beans:property name="username" value="sa"/>
    <beans:property name="password" value=""/>
</beans:bean>
<jdbc:embedded-database id="HSQL_DS">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:data.sql"/>
</jdbc:embedded-database>

и мой тестовый класс выглядит так:

public class Tester {

    private EmbeddedDatabase db;

    @Before
     public void setUp(){
        db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();


    }

    @Test
    public void TestMe(){
        System.out.println("Testing");
    }


    @After
    public void tearDown(){

        db.shutdown();
    }
}
...