Question

Je voudrais test unitaire ma couche de persistance de mybatis en utilisant une base de données HSQL en mémoire. L'application réelle utilise une base de données Oracle. Cette belle unitl nous avons commencé à travaillé l'ajout de numéros incrémentée auto pour les colonnes id. Oracle nécessite l'utilisation d'une séquence pour obtenir le numéro incrémentée si une séquence appelée basis_seq a été créé dans la base de données Oracle. Dans mon mybatis fichier XML Mapper J'ai ceci:

<insert id="insertBasis" parameterType="com.foo.Basis" useGeneratedKeys="true" keyProperty="id">
        <selectKey resultType="long" keyProperty="id" order="BEFORE">
            SELECT basis_seq.NEXTVAL FROM DUAL
        </selectKey>
        insert into basis
        (id, name)
        values
        (#{id}, #{name})
</insert>

Cela fonctionne quand je lance l'application, mais le test unitaire comporte une erreur:

org.springframework.jdbc.BadSqlGrammarException: Erreur clé de sélection ou la mise en résultat d'objet de paramètre. Cause: java.sql.SQLSyntaxErrorException: l'utilisateur n'a pas le privilège ou un objet non trouvé: DUAL; mauvaise grammaire SQL []; exception imbriquée est java.sql.SQLSyntaxErrorException: l'utilisateur n'a pas le privilège ou un objet non trouvé: DUAL

Si je comprends « DUAL » est une sorte de table virtuelle dans Oracle qui stocke les séquences et je n'ai pas dans ma base de données de test. Si je supprime la <selectKey>-tag le travail de test unitaire (depuis HSQL peut générer automatiquement ids pour les colonnes de identity marqués), mais pas l'application réelle. Une solution serait de créer des fichiers XML mybatis mappeur séparés pour les tests unitaires sans <selectKey>-tag, mais ce n'est pas souhaitable car je veux tester la configuration réelle.

Y at-il un moyen de créer et d'utiliser une séquence dans HSQL aussi bien ou quelques mybatis solution de contournement peut-être pour cela? Ou devrais-je utiliser une autre base de données pour mon test unitaire comme H2?


J'utilise:

  • Spring 3.0.5
  • HSQL 2.2.4
  • mybatis 3.0.5

Mise à jour:

Après avoir obtenu la réponse de FredT , voici comment je modifié ma configuration Spring:

Avant ma source de défini avec des données:

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:test-data/schema.sql" />
    <jdbc:script location="classpath:test-data/data.sql" />
</jdbc:embedded-database>

Maintenant, je fais ceci:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_ora=true" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:test-data/schema.sql" />
    <jdbc:script location="classpath:test-data/data.sql" />
</jdbc:initialize-database>

En outre, dans schema.sql Je dois créer les séquences:

CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;

(si vous exécutez ce script plusieurs fois lors de tests unitaires, n'oubliez pas d'ajouter drop sequence BASIS_SEQ if exists; en haut de schema.sql)

Était-ce utile?

La solution

Dernières HSQLDB fournit une vaste compatibilité de syntaxe Oracle. Tout ce que vous avez besoin est d'ajouter sql.syntax_ora=true à l'URL de votre base de données. Par exemple:

jdbc:hsqldb:mem:test;sql.syntax_ora=true

Voir le Guide

http://hsqldb.org/doc/2.0/guide/deployment-chapt.html

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

syntaxe SQL compatibilité est constamment étendue dans les nouvelles versions de HSQLDB, il est donc préférable d'utiliser la dernière version disponible.

Autres conseils

Vous pouvez toujours utiliser votre configuration de la ligne 4 d'origine en utilisant <jdbc:embedded-database ...>. Il suffit d'ajouter la ligne suivante au début de votre test de données / fichier schema.sql:

SET DATABASE SQL SYNTAX ORA TRUE;

Ceci est effectivelly même que l'ajout sql.syntax_ora=true à votre URL JDBC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top