Vous vous en rappelez sans doute, je vous avais parlé de l'échappement automatique des noms de champs et de tables en JPA 2, et ça vous avait déjà diablement intéressé. Hé bien voilà, le temps des tests unitaires est venu, et pour cela, on utilise DbUnit et HSQLDB[1].

Afin de gérer l'import des données SQL pour les tests unitaires, on étend la classe DataSourceBasedDBTestCase, 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.

Et voilà: j'obtenais une jolie exception NoSuchTableException: NOM_DE_MA_TABLE (en majuscules, donc).

Cette classe utilitaire nous permet de surcharger la méthode setUpDatabaseConfig:

@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
	super.setUpDatabaseConfig(config);
	config.setProperty(DatabaseConfig.PROPERTY_ESCAPE_PATTERN, "\"?\"");
	config.setProperty(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
}

Avec ces deux propriétés, on dit deux choses :

  • on échappe les noms des champs et des tables lors des requêtes
  • 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.

Et voilà le travail !

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.

Note

[1] 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".