通过spring进行集成测试,hsqldb无法识别“使用索引”

时间:2015-01-25 13:43:32

标签: spring integration-testing hsqldb

我有一个带有dao和集成测试的spring项目。对于集成测试,我使用的是hsqldb。 一切都很好,直到我不得不添加" USE INDEX"命令我的查询。应用程序正常工作并按预期获取记录。 但测试开始因SQL异常而失效"命令中未使用的令牌USE"。

所以我想知道,有没有办法配置htsqldb来识别" USE INDEX"声明?感谢

我的Dao看起来如下:

public interface SomeDao extends CrudRepository<Mapping, Integer> {
@Query(value = "SELECT mm.record_id" +
            " FROM mappings mm" +
            " USE INDEX (mapping_indx)" +
            " JOIN records ss ON mm.record_id = ss.id "
            " WHERE mm.name= :name", nativeQuery = true)
    public List<Integer> getRecordsIds(@Param("name") String name);

}

我的测试示例:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath*:testContext.xml")
    public class SimpleTEst{
    @Autowired
    private SomeDao someDao;
//...other daos

    @Test
    public void testDao() {
//...test background creation
      List<Integer> actualList = someDao.getRecordsIds("testing");
      assertEquals(expectedList, actualList);
    }

    }

testContext.xml包含以下设置

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem:myTest"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaDialect" ref="jpaDialect"/>
        <property name="persistenceXmlLocation" value="classpath*:/META-INF/persistence.xml"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.cache.use_second_level_cache">false</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="dataSource" ref="dataSource"/>
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean id="namingStrategy" class="org.hibernate.cfg.ImprovedNamingStrategy"/>

1 个答案:

答案 0 :(得分:1)

不同的dbs不兼容,所以一般情况下,你不能在它们上运行相同的sql。你有一些快速的潜在解决方法:

  • 教你的测试数据库新的构造/功能。在一些内存中的dbs中,您可以注册新功能。不确定它是不是你的情况
  • 在不同的vendor-db上运行时跳过一些测试。如果你也没有在同一个供应商数据库上进行测试,那么这实际上意味着:删除测试:(
  • 根据运行时检测到的供应商动态创建/选择查询。这样你可以限制测试的部分查询

总结一下:绝对没有办法在hsqldb上测试use index。你应该在真正的数据库上测试它。如果你真的想坚持使用hsqldb,你可以做的就是尝试尽可能地测试类似的查询......但不一样,抱歉