DbUnit NoSuchTableException с Spring, Hibernate, HSQSLB - PullRequest
3 голосов
/ 09 декабря 2011

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

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

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

@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?Любая помощь приветствуется!

1 Ответ

1 голос
/ 09 декабря 2011

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

...