【问题标题】:integration tests via spring, hsqldb doesn't recognize "use index"通过 spring 进行集成测试,hsqldb 无法识别“使用索引”
【发布时间】:2015-03-24 02:17:30
【问题描述】:

我有一个带有 dao 和集成测试的 spring 项目。对于集成测试,我使用的是 hsqldb。 一切都很好,直到我不得不在我的查询中添加“USE INDEX”命令。该应用程序工作正常并按预期获取记录。 但是测试开始失败,出现 SQL 异常“Unexpected token USE in command”。

所以我想知道,有没有办法配置 htsqldb 来识别“USE INDEX”语句?谢谢

我的道如下所示:

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"/>

【问题讨论】:

  • 集成测试的原则是使用实际应用程序中使用的所有软件组件并将它们一起测试,以确保一旦部署,应用程序将完美运行。您的集成测试使用的数据库不是您的生产数据库。因此,不仅测试没有通过,尽管它们在真实数据库中会通过,而且您根本无法保证,因为您不知道通过的测试是否也会在真实数据库中通过。所以我的建议是:使用真实的数据库。
  • 感谢您提供良好而清晰的输入,我将来会迁移到真实数据库。但是目前,我需要知道是否真的有办法解决这个问题
  • 我不知道这有什么好的。您正在使用与您的生产数据库不兼容的数据库(在您的测试中) - 有什么可以改变的? :)
  • 我什么都猜不到:) 感谢您的评论,我需要知道我在这里并没有遗漏任何东西,真的与它无关

标签: spring integration-testing hsqldb


【解决方案1】:

不同的数据库是不兼容的,所以一般来说,你不能在它们上运行相同的sql。您有一些快速的潜在解决方法:

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

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

【讨论】:

  • 感谢您的解释和解决方法列表,这提供了更多尝试的方法,谢谢
  • 好的,这个问题可能不合适,但只是为了确定。所以 hsqldb 只是不能支持 mysql 的所有语句,也没有什么可做的。或者原因可能是内存数据库中缺少索引?
  • 是的,db X 不支持 db Y 支持的所有语句
猜你喜欢
  • 1970-01-01
  • 2022-07-04
  • 1970-01-01
  • 2018-02-01
  • 2015-08-12
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多