DbUnit NoSuchTableException与Spring、Hibernate、HSQSLB
我正在为当地的学区做一些志愿者培训。他们使用Spring和Hibernate作为基本的CRUD应用程序。我能够在开发数据库上运行一些JUnit测试,但不想使用DbUnit对HSQLDB进行测试 我得到一个NoSuchTableException,DbUnit从XML文件加载初始数据。我已经阅读了有关StackOverflow的其他文章,他们倾向于建议将Hibernate属性Hibernate.hbm2ddl.auto设置为createdrop。我已经这样做了,但仍然得到例外。我想知道是否有一些基本的设置,我错过了 这是我的测试用例:DbUnit NoSuchTableException与Spring、Hibernate、HSQSLB,hibernate,spring,junit,dbunit,Hibernate,Spring,Junit,Dbunit,我正在为当地的学区做一些志愿者培训。他们使用Spring和Hibernate作为基本的CRUD应用程序。我能够在开发数据库上运行一些JUnit测试,但不想使用DbUnit对HSQLDB进行测试 我得到一个NoSuchTableException,DbUnit从XML文件加载初始数据。我已经阅读了有关StackOverflow的其他文章,他们倾向于建议将Hibernate属性Hibernate.hbm2ddl.auto设置为createdrop。我已经这样做了,但仍然得到例外。我想知道是否有一些基
@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);
}
}
有没有我缺少的简单配置?Hibernate文件中的模式和目录名称是否必须与hsqldb URL匹配?
感谢您的帮助 您的单元测试是否启动了hibernate框架。因为看起来您想要使用Hibernate来创建表。但这只有在测试首先“启动”hibernate时才有效。没错,在hibernate/dbunit中搜索问题之前,先查看spring上下文是否正确加载。删除dbunit代码并告诉我们您的Springbean是否是autoriwred。谢谢大家,我删除了dbunit代码并指向另一个数据源—我们用于开发的MSSQL数据库。我能够从JUnit对该数据库运行查询,因此我认为数据源和DAOBean加载正确。关于如何“启动”休眠的思考?现在Hibernate DAO扩展了另一个Hibernate类,该类具有基本的存储、删除、getById等。该类使用HibernateTemplate。否则,如果Hibernate“启动”了,我会寻找什么来尝试找到它的位置?谢谢如果它适用于普通数据库(不适用于memmory数据库),但不适用于memmory数据库,那么问题可能是您使用了两个不同的memmory数据库,或者数据库在初始化后“关闭”。发现DbUnit由..查询,在我的例子中,是查询表schoolnet.dbo.tbl_snu rits_admins。如果在DbUnit平面XML文件中将表名设置为schoolnet.dbo.tbl_sn_rits_admins,则仍然会出现NoSuchTableException。如果我从HibernateXML文件中删除模式和目录属性,那么DbUnit和HSQLDB可以正常运行。现在我正在考虑将目录和模式属性从表的HibernateXML文件移到SpringXML文件中。有单独的测试和生产SpringXML文件是一种常见的习惯用法吗?
<?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>
<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>
<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-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>
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...