在我正在研究的Java项目中,我为单元测试提供了以下设置:
@RunWith(SpringJUnit4ClassRunner.class)
和@WebAppConfiguration
来运行单元测试,并使用MockMvc
创建一个webAppContextSetup(webApplicationContext)
实例来测试应用程序。< / LI>
hibernate.hbm2ddl.import_files
属性以使用SQL语句加载文件import.sql
以填充(内存中)数据库。现在,我已经确认了以上所有这些工作:
import.sql
中的SQL语句,各种测试都会确认。现在问题:我在import.sql
中添加的语句出现的错误似乎没有在任何地方报告,也没有任何迹象表明发生了错误。相反,后续语句根本不会执行。 (我通过测试证实了这一点。)
是否有任何方式或地点 报告我显然不知道?是否有额外的Hibernate属性?
摘自hibernate测试配置:
<bean id="sessionFactory" name="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.archive.autodetection">class,hbm</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop>
<prop key="hibernate.connection.username">sa</prop>
<prop key="hibernate.connection.password"></prop>
<prop key="hibernate.connection.url">jdbc:hsqldb:mem:myschema</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.hbm2ddl.import_files">configuration/test/import.sql</prop>
<prop key="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</prop>
<!-- when using type="yes_no" for booleans, the line below allow booleans in HQL expressions: -->
<prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
</props>
</property>
</bean>
答案 0 :(得分:1)
不是您的问题的答案,而是处理测试数据库填充的替代方法。
Spring中有一个名为jdbc
的XML命名空间,它允许您在Spring上下文启动期间使用初始数据预填充数据库。它还可以很好地报告SQL中的错误:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="org/mytestproject/schema-drop-hsqldb.sql" />
<jdbc:script location="org/mytestproject/schema-hsqldb.sql" />
<jdbc:script location="org/mytestproject/data-hsqldb.sql" />
</jdbc:initialize-database>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="validationQuery" value="${jdbc.validationQuery}"/>
</bean>
</beans>
答案 1 :(得分:1)
我无法像@Julien Kroneg建议的那样获取异常记录。
但是我能够在方法org.hibernate.tool.hbm2ddl.SchemaExport#importScript
的catch块中放置一个断点,其中trimmedSql
代表正在应用的每个SQL语句:
catch ( Exception e ) {
if (haltOnError) {
throw new ImportScriptException( "Error during statement execution (file: '"
+ namedReader.getName() + "'): " + trimmedSql, e );
}
exceptions.add(e);
LOG.unsuccessful(trimmedSql);
LOG.error(e.getMessage());
}
考虑到初始化脚本是静态的而不是真正的业务数据,这可能就足够了,一旦使它们开始工作,便希望它们继续工作。
答案 2 :(得分:0)
您可以使用级别TRACE激活类org.hibernate.tool.hbm2ddl.SchemaExport
上的日志记录。
在DEBUG级别记录了一些错误(例如找不到文件):
10:29:21,039 DEBUG SchemaExport:353 - Import file not found: ../myFile.sql