23

我刚刚意识到 DBUnit 不会自行创建表(请参阅如何使用纯 JDBC 和 HSQLDB 测试 DBUnit 而不会遇到 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";
}
4

5 回答 5

16

并不真地。正如您链接的答案所指出的,dbunit xml 文件包含数据,但不包含列类型。

你真的不想这样做;您冒着测试工件污染数据库的风险,从而增加了生产代码意外依赖测试过程创建的表的可能性。

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

于 2009-10-07T12:34:34.200 回答
4

不可以。您必须执行包含表定义的 SQL 脚本。

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

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

于 2009-10-07T12:30:41.590 回答
3

Spring Boot/ Spring JDBC 可以使用普通 JDBC 初始化数据库。

Spring JDBC 有一个 DataSource 初始化器特性。Spring Boot 默认启用它并从标准位置schema.sqldata.sql(在类路径的根目录中)加载 SQL。此外,Spring Boot 将加载schema-${platform}.sqldata-${platform}.sql文件(如果存在),其中平台是 的值spring.datasource.platform,例如,您可以选择将其设置为数据库的供应商名称(hsqldb、h2、oracle、mysql、postgresql 等)。

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

于 2016-05-03T11:34:28.897 回答
2

如果您使用 JPA,您通常可以配置您的 JPA 提供程序,以便它在初始化时创建/更新表。

例如,对于休眠,指定属性hibernate.hbm2ddl.auto并将其值设置为 create-drop(应该可以用于测试)。

另请参阅:Hibernate 文档,第 3 章配置

但是,请确保 JPA 提供程序是第一个访问数据库的;)

于 2009-10-18T20:11:39.003 回答
0

我只是想插话说这对我很有帮助。我需要连接到 Oracle 数据库并将其导出到 XML 文件,然后将其作为测试 HSQL 数据库导入并使用 Hibernate 访问它。我在做之前使用此代码创建表

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

不过需要注意的是,此代码将每个表的第一列设置为主键,因此如果您使用关系表,请小心,因为您可能会在导入时遇到“主键约束违规”。感谢您的代码片段!

于 2011-03-18T14:29:39.447 回答