【发布时间】: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