2009-10-07 12 views
23

Ho appena realizzato che DBUnit non crea tabelle da solo (vedere How do I test with DBUnit with plain JDBC and HSQLDB without facing a NoSuchTableException?).Esiste un modo per DBUnit di creare automaticamente tabelle?

Esiste un modo per DBUnit di creare automaticamente tabelle da un set di dati o dtd?

EDIT: Per semplice sperimentazione di un database in memoria come HSQLDB, un approccio grezzo può essere utilizzato per creare automaticamente tabelle:

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"; 
} 

risposta

15
Non

davvero. Come la risposta che hai indicato, i file xml di dbunit contengono dati, ma non i tipi di colonna.

E tu davvero non vuoi farlo; si rischia di inquinare il database con artefatti di test, aprendo la possibilità che il codice di produzione si basi accidentalmente sulle tabelle create dal processo di test.

La necessità di eseguire questa operazione suggerisce fortemente che i processi di creazione e manutenzione di Db non siano definiti e programmati adeguatamente.

3

No. dovrà eseguire uno script SQL con la definizioni tabella in.

Come ho postato nell'altro thread, l'XML non contiene dati sufficienti per creare una tabella. Immagino che potresti fare qualcosa di spaventoso come analizzare i valori per tentare di capire quali valori contiene ma sarebbe piuttosto fragile. Questo differisce da Hibernate in quanto le classi annotate contengono molte informazioni su come appare il database. Parte nelle annotazioni e parte nei campi dei tipi Java.

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

1

Se si utilizza JPA, in genere è possibile configurare il provider JPA in modo che crei/aggiorni le tabelle durante l'inizializzazione.

E.g. per l'ibernazione, specificare la proprietà hibernate.hbm2ddl.auto e impostare il valore su create-drop (dovrebbe andare bene per il test).

Consulta anche: Hibernate Documentation, Chapter 3 Configuration

Tuttavia, assicurarsi che il provider JPA è il primo per accedere al DB;)

0

Volevo solo carillon e dire che questo è stato molto utile per me. Avevo bisogno di connettermi a un database Oracle ed esportarlo in un file XML, quindi importarlo come database HSQL di prova e accedervi con Hibernate. Ho usato questo codice per creare le tabelle prima di fare

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

Una parola di cautela, però, questo codice imposta la prima colonna di ogni tabella come chiave primaria, quindi fate attenzione se si utilizzano le tabelle di relazione, come si può ottenere un "Violazione del vincolo della chiave primaria" durante l'importazione. Grazie per il codice snippet!

+0

Questo non crea alcuna tabella, il codice appena inserisce i dati dal set di dati forniti. – tak3shi

3

Spring Boot/Spring JDBC può inizializzare un database con JDBC normale.

Spring JDBC ha una funzione di inizializzazione DataSource.Spring Boot abilita per impostazione predefinita e carica SQL dalle ubicazioni standard schema.sql e data.sql (nella radice del classpath). Inoltre, Spring Boot caricacarica i file schema-${platform}.sql e data-${platform}.sql (se è presente ), dove la piattaforma è il valore di spring.datasource.platform, ad es. è possibile scegliere di impostarlo sul nome del fornitore del database (hsqldb, h2, oracle, mysql, postgresql ecc.).

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

Problemi correlati