Подтвердить что ты не робот

Spring/Hibernate/Junit пример тестирования DAO против HSQLDB

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

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

Из-за этого у меня возникли проблемы с пониманием того, как настроить JUnit-тест для реализации DAO для создания/чтения (только очень простых функций) для HSQLDB в памяти. Я нашел несколько примеров, но использование внутреннего упорства означает, что я не могу расширить некоторые из классов, которые показывают примеры (я не могу правильно настроить приложение-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>
    
4b9b3361

Ответ 1

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.

Это всего лишь схема того, что делать, но, надеюсь, этого достаточно, чтобы вы начали.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

<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();
    }
}