Question

Je viens de réaliser que DBUnit ne crée pas des tables par lui-même (voir Comment puis-je tester avec DBUnit avec JDBC simple et HSQLDB sans faire face à un NoSuchTableException ).

Est-il possible pour DBUnit créer automatiquement des tables à partir d'un ensemble de données ou dtd?

EDIT: Pour les tests simples d'une base de données en mémoire comme HSQLDB, une approche brute peut être utilisée pour créer automatiquement des tables:

private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException {
    String[] tableNames = dataSet.getTableNames();

    String sql = "";
    for (String tableName : tableNames) {
      ITable table = dataSet.getTable(tableName);
      ITableMetaData metadata = table.getTableMetaData();
      Column[] columns = metadata.getColumns();

      sql += "create table " + tableName + "( ";
      boolean first = true;
      for (Column column : columns) {
        if (!first) {
          sql += ", ";
        }
        String columnName = column.getColumnName();
        String type = resolveType((String) table.getValue(0, columnName));
        sql += columnName + " " + type;
        if (first) {
          sql += " primary key";
          first = false;
        }
      }
      sql += "); ";
    }
    PreparedStatement pp = connection.prepareStatement(sql);
    pp.executeUpdate();
}

private String resolveType(String str) {
  try {
    if (new Double(str).toString().equals(str)) {
      return "double";
    }
    if (new Integer(str).toString().equals(str)) {
      return "int";
    }
  } catch (Exception e) {}

  return "varchar";
}
Était-ce utile?

La solution

Pas vraiment. Comme la réponse que vous avez lié indique, les fichiers xml DBUnit contiennent des données, mais pas les types de colonnes.

Et vous ne voulez pas vraiment faire; vous risquez de polluer votre base de données avec des objets de test, ouvrant la possibilité que le code de production sera accidentellement compter sur les tables créées par le processus de test

Ayant besoin de faire cela suggère fortement que vous n'avez pas la création de votre db et processus de maintenance et défini de manière adéquate scriptée.

Autres conseils

Non. Vous devrez exécuter un script SQL avec les définitions de table dans.

Comme je l'ai posté dans l'autre thread, XML ne contient pas assez de données pour créer une table. Je suppose que vous pourriez faire quelque chose d'effrayant comme analyser les valeurs pour tenter de comprendre ce que les valeurs qu'il contient, mais ce serait tout à fait fragile. Cela diffère de la mise en veille prolongée en ce que les classes annotées ne contiennent beaucoup d'informations sur la façon dont la base de données semble. Partie dans les annotations et une partie dans les types Java champs ont.

http://www.dbunit.org/faq.html#ddl

Spring Boot / Spring JDBC peut initialiser une base de données avec JDBC simple.

  

Spring JDBC dispose d'une fonction d'initialisation DataSource. Spring Boot permet   par défaut et les charges SQL à partir des emplacements standards et schema.sql   data.sql (dans la racine du classpath). En outre Spring Boot   charger les fichiers schema-${platform}.sql et data-${platform}.sql (si   présent), où la plate-forme est la valeur de spring.datasource.platform,   par exemple. vous pouvez choisir de le définir au nom du fournisseur de la base de données   (Hsqldb, h2, oracle, mysql, postgresql etc.).

https: // docs. spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

Si vous utilisez JPA vous pouvez généralement configurer votre fournisseur JPA afin qu'il crée / met à jour les tables lors de l'initialisation.

par exemple. pour mise en veille prolongée, spécifiez la propriété hibernate.hbm2ddl.auto et définir sa valeur pour créer goutte (devrait être bon pour les tests).

Voir aussi: Hibernate Documentation, chapitre 3 Configuration

Cependant, assurez-vous que le fournisseur de JPA est le premier à accéder à la DB;)

Je voulais juste sonner et dire que cela a été très utile pour moi. Je avais besoin de se connecter à une base de données Oracle et l'exporter vers un fichier XML, importer ensuite comme une base de données HSQL de test et d'accéder avec Hibernate. J'ai utilisé ce code pour créer les tables avant de faire

DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);. 

Un mot d'avertissement cependant, ce code définit la première colonne de chaque table comme la clé primaire, alors soyez prudent si vous utilisez des tables de relation que vous pouvez obtenir une « violation de contrainte de clé primaire » à l'importation. Merci pour l'extrait de code!

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