6

在我正在处理的 Java 项目中,我为我们的单元测试设置了以下设置:

  • 我正在使用 Spring Test MVC,@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration运行单元测试,并创建一个用于测试应用程序的MockMvc实例。webAppContextSetup(webApplicationContext)
  • 我有一个 Hibernate 配置来设置内存中的 HSQLDB,所有表都是基于 @Entity 类创建的。
  • 在 Hibernate 配置中,我将hibernate.hbm2ddl.import_files属性设置为使用 SQL 语句加载文件import.sql以填充(内存中)数据库。

现在,我已经确认了以上所有这些工作:

  • 测试可以成功地从内存数据库中插入/检索。
  • import.sql正如各种测试所证实的那样,执行中的 SQL 语句。

现在的问题是:我添加的语句发生的错误import.sql似乎没有在任何地方报告,也没有任何迹象表明发生了错误。相反,后续语句根本不会执行。(我已经通过测试证实了这一点。)

是否有任何方式或地点报告了我显然不知道的这些错误?是否有额外的 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>
4

3 回答 3

1

不是您问题的真正答案,而是处理测试数据库人口的替代方法。

Spring 中有一个称为 XML 名称空间的名称,jdbc它允许您在 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>
于 2015-04-20T20:35:42.120 回答
1

我无法像@Julien Kroneg 建议的那样记录异常。

但是我能够在方法的 catch 块中放置一个断点,org.hibernate.tool.hbm2ddl.SchemaExport#importScript其中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());
}

考虑到 init 脚本是静态的而不是真正的业务数据,这可能就足够了,一旦你让它们工作,它们有望继续工作

于 2019-10-24T15:03:47.923 回答
0

您可以使用 TRACE 级别激活登录类org.hibernate.tool.hbm2ddl.SchemaExport

在调试级别记录了一些错误(例如找不到文件):

10:29:21,039 DEBUG SchemaExport:353 - Import file not found: ../myFile.sql
于 2016-10-19T08:34:55.640 回答