views:

679

answers:

3

I just realized that DBUnit doesn't create tables by itself (see How do I test with DBUnit with plain JDBC and HSQLDB without facing a NoSuchTableException?).

Is there any way for DBUnit to automatically create tables from a dataset or dtd?

EDIT: For simple testing of an in-memory database like HSQLDB, a crude approach can be used to automatically create 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";
    }
  } catch (Exception e) {}

  try {
    if (new Integer(str).toString().equals(str)) {
      return "int";
    }
  } catch (Exception e) {}

  return "varchar";
}
+2  A: 

No. You will have to execute an SQL script with the table definitions in.

As I posted in the other thread, the XML does not contain enough data to create a table. I guess you could do something scary like parse the values to attempt to work out what values it contains but that would be quite brittle. This differs from Hibernate in that annotated classes do contain a lot of information on how the database looks. Part in annotations and part in the Java types fields have.

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

mlk
+4  A: 

Not really. As the answer you linked points out, the dbunit xml files contain data, but not column types.

And you really don't want to do this; you risk polluting your database with test artifacts, opening up the possibility that production code will accidentally rely on tables created by the test process.

Needing to do this strongly suggests you don't have your db creation and maintenance process adequately defined and scripted.

tpdi
A: 

If you are using JPA you can usually configure your JPA provider so that it creates/updates the tables on initialization.

E.g. for hibernate, specify the property hibernate.hbm2ddl.auto and set its value to create-drop (should be fine for testing).

See also: Hibernate Documentation, Chapter 3 Configuration

However, make sure that the JPA provider is the first to access the DB ;)

Martin Klinke