Я занимаюсь волонтерским развитием для местного школьного округа. Они используют Spring и Hibernate для базового приложения CRUD. Мне удалось запустить некоторые тесты JUnit для базы данных разработки, но я не хотел бы пробовать их для HSQLDB с использованием DbUnit.

Я получаю исключение NoSuchTableException, когда DbUnit загружает исходные данные из XML-файла. Я прочитал другие сообщения на StackOverflow по этому поводу, и они, как правило, рекомендуют установить для свойства Hibernate hibernate.hbm2ddl.auto значение create-drop. Я сделал это и все еще получаю исключение. Мне интересно, есть ли что-то основное в настройке, чего мне не хватает.

Это мой тестовый пример:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:spring-test-datasource.xml",
        "classpath:spring-test-dao.xml"
})
@Transactional
public class HibernateRitsAdminDaoTest {
    @Autowired protected RitsAdminDao ritsAdminDao;
    @Autowired protected DataSource dataSource;
    protected IDatabaseTester dbTester;

    @Before
    public void setUp() throws Exception {
        dbTester = new DataSourceDatabaseTester(dataSource);
        IDataSet dataSet = new FlatXmlDataSetBuilder().build(new FileInputStream("test/RitsAdminsTest.xml"));
        dbTester.setDataSet(dataSet);
        dbTester.onSetup();
    }

    @After
    public void tearDown() throws Exception {
        dbTester.onTearDown();
    }

    @Test
    public void testGetAll() throws Exception {
        List<RitsAdmin> ritsAdmins = ritsAdminDao.getAll();
        assertTrue(ritsAdmins.size() > 0);
    }
}

Это мои данные DbUnit для заполнения таблицы:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <tbl_sn_rits_admins profile_id="1"/>
    <tbl_sn_rits_admins profile_id="6"/>
    <tbl_sn_rits_admins profile_id="88"/>
</dataset>

Это определение источника данных в spring-test-datasource.xml.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem:schoolnet"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>

И этот spring-test-dao.xml, в котором определены свойства DAO и Hibernate:

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>us/mn/k12/district/domain/RitsAdmin.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
            </props>
        </property>
    </bean>

    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

И, наконец, вот файл Hibernate для таблицы:

<hibernate-mapping package="us.mn.k12.district.domain">
    <class name="RitsAdmin" table="tbl_sn_rits_admins" schema="dbo" catalog="schoolnet">
        <id name="profileId" type="long">
            <column name="profile_id" />
        </id>
    </class>
</hibernate-mapping>

Обратите внимание, что я установил для свойства hibernate hbm2dll.auto значение «create-drop». Это то, что предлагают другие сообщения SO. Это должно создать таблицу во время инициализации, но я получаю следующую трассировку стека:

org.dbunit.dataset.NoSuchTableException: tbl_sn_rits_admins
    at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288)
    at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
    at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
    at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
    at us.mn.k12.district.dao.HibernateRitsAdminDaoTest.setUp(HibernateRitsAdminDaoTest.java:41)
... keeps going...

Есть ли простая конфигурация, которую мне не хватает? Должны ли имена схемы и каталога в файле Hibernate каким-то образом совпадать с URL-адресом hsqldb? Любая помощь приветствуется!

3
joeg3 9 Дек 2011 в 01:39

1 ответ

Запустил ли ваш модульный тест инфраструктуру гибернации. Потому что похоже, что вы хотите использовать Hibernate для создания таблиц. Но это работает только в том случае, если ваш тест сначала «запускает» спящий режим.

1
Ralph 9 Дек 2011 в 13:03
Правильно, сначала посмотрите, правильно ли загружен ваш контекст Spring, прежде чем искать проблему в hibernate/dbunit. Удалите этот код dbunit и сообщите нам, авторизованы ли ваши spring bean-компоненты или нет.
 – 
Sebastien Lorber
10 Дек 2011 в 04:27
Спасибо, ребята, я удалил код dbunit и указал на другой источник данных — базу данных MSSQL, которую мы используем для разработки. Я могу выполнять запросы из JUnit к этой базе данных, поэтому я думаю, что источник данных и компоненты DAO загружаются правильно. Мысли о том, как «запустить» Hibernate? Прямо сейчас Hibernate DAO расширяет другой класс Hibernate, который имеет базовое хранилище, удаление, getById и т. д. Этот класс использует HibernateTemplate. В противном случае, что бы я искал, чтобы попытаться найти, где/если Hibernate «запущен»? Спасибо!
 – 
joeg3
13 Дек 2011 в 00:04
Если это работало для обычной (не в базе данных в памяти), но не для базы данных в памяти, проблема может заключаться в том, что вы используете две разные базы данных в памяти, или база данных «закрыта» после инициализации.
 – 
Ralph
13 Дек 2011 в 12:28
Выяснил, что DbUnit запрашивает по <каталог>.<схема>.<имя_таблицы>, в моем случае — к таблице schoolnet.dbo.tbl_sn_rits_admins. Я по-прежнему получаю исключение NoSuchTableException, если задаю имя таблицы schoolnet.dbo.tbl_sn_rits_admins в неструктурированном XML-файле DbUnit. Если я уберу свойства схемы и каталога из XML-файла Hibernate, то DbUnit и HSQLDB будут работать нормально. Прямо сейчас я думаю о перемещении свойств каталога и схемы из XML-файла Hibernate для таблицы в XML-файл Spring. Является ли общепринятой идиомой наличие отдельных тестовых и рабочих XML-файлов Spring?
 – 
joeg3
14 Дек 2011 в 22:28