Geekeries et d'autres choses - Mot-clé - dbunit2024-01-29T10:26:26+01:00urn:md5:51ff50324f4f72c0e78683659647f2c8DotclearÉchappement des noms de champs et de tables avec DbUniturn:md5:7a5744fbfb4bb027a1c90adfe307a6962011-11-18T18:36:00+01:002012-07-01T17:31:09+02:00Julien WajsbergInformatiquedbunitderbyhsqlhsqldbjavaquote <p>Vous vous en rappelez sans doute, je vous avais parlé <a href="http://www.everlong.org/blog/index.php/post/2011/09/%C3%89chapper-automatiquement-les-noms-des-champs-et-des-tables-en-JPA-2" hreflang="fr" title="Échapper automatiquement les noms des champs et des tables en JPA 2">de l'échappement automatique des noms de champs et de tables en JPA 2</a>, et ça vous avait déjà diablement intéressé. Hé bien voilà, le temps des tests unitaires est venu, et pour cela, on utilise <a href="http://www.dbunit.org" hreflang="en">DbUnit</a> et <a href="http://hsqldb.org" hreflang="en">HSQLDB</a><sup>[<a href="https://everlong.org/blog/index.php/post/2011/11/%C3%89chappement-des-noms-de-champs-et-de-tables-avec-DbUnit#pnote-441-1" id="rev-pnote-441-1">1</a>]</sup>.</p>
<p>Afin de gérer l'import des données SQL pour les tests unitaires, on étend la classe <a href="http://www.dbunit.org/apidocs/org/dbunit/DataSourceBasedDBTestCase.html" hreflang="en">DataSourceBasedDBTestCase</a>, avec une petite mécanique qui permet d'aller chercher automatiquement le fichier de données qui porte le même nom que la classe de test.</p>
<p>Et voilà: j'obtenais une jolie exception <code>NoSuchTableException: NOM_DE_MA_TABLE</code> (en majuscules, donc).</p>
<p>Cette classe utilitaire nous permet de surcharger la méthode <code>setUpDatabaseConfig</code>:</p>
<pre class="java java" style="font-family:inherit">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> setUpDatabaseConfig<span style="color: #009900;">(</span>DatabaseConfig config<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">setUpDatabaseConfig</span><span style="color: #009900;">(</span>config<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
config.<span style="color: #006633;">setProperty</span><span style="color: #009900;">(</span>DatabaseConfig.<span style="color: #006633;">PROPERTY_ESCAPE_PATTERN</span>, <span style="color: #0000ff;">"<span style="color: #000099; font-weight: bold;">\"</span>?<span style="color: #000099; font-weight: bold;">\"</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
config.<span style="color: #006633;">setProperty</span><span style="color: #009900;">(</span>DatabaseConfig.<span style="color: #006633;">FEATURE_CASE_SENSITIVE_TABLE_NAMES</span>, <span style="color: #003399;">Boolean</span>.<span style="color: #000066; font-weight: bold;">TRUE</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span></pre>
<p>Avec ces deux propriétés, on dit deux choses :</p>
<ul>
<li>on échappe les noms des champs et des tables lors des requêtes</li>
<li>on garde le nom de la table tel que spécifié dans le fichier de données, on ne cherche pas à le mettre en majuscules ou minuscules comme c'est fait par défaut.</li>
</ul>
<p>Et voilà le travail !</p>
<p>Attention, la propriété d'échappement est à adapter en fonction de la base que vous utilisez; notamment, avec MySQL, il faut utiliser des guillemets inversés au lieu des guillemets doubles.</p>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="https://everlong.org/blog/index.php/post/2011/11/%C3%89chappement-des-noms-de-champs-et-de-tables-avec-DbUnit#rev-pnote-441-1" id="pnote-441-1">1</a>] Note: j'avais le même problème avec Derby, mais pas avec MySQL, sans doute parce que je l'avais configuré en "case insensitive".</p></div>