DBUnit 有没有办法自动创建表?

2022-09-01 23:35:32

我刚刚意识到DBUnit不会自己创建表(请参阅如何使用DBUnit与普通JDBC和HSQLDB进行测试而不面对NoSuchTableException?)。

DBUnit 有没有办法从数据集或 dtd 自动创建表?

编辑:对于像 HSQLDB 这样的内存中数据库的简单测试,可以使用一种粗略的方法来自动创建表:

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

答案 1

没有。正如您链接的答案所指出的那样,dbunit xml 文件包含数据,但不包含列类型。

你真的不想这样做;您可能会被测试工件污染数据库,从而有可能生产代码意外地依赖于测试过程创建的表。

需要这样做强烈表明您没有充分定义数据库创建和维护过程并编写脚本。


答案 2

哈哈您必须执行包含表定义的 SQL 脚本。

正如我在另一个线程中发布的那样,XML 不包含足够的数据来创建表。我想你可以做一些可怕的事情,比如解析值,试图找出它包含哪些值,但那会很脆弱。这与Hibernate的不同之处在于,带注释的类确实包含有关数据库外观的大量信息。部分在注释和部分在 Java 类型字段中有。

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


推荐