有没有办法对DBUnit的自动创建表?(Is there any way for DBUnit to

2019-07-21 06:41发布

我刚刚意识到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";
}

Answer 1:

并不是的。 当你链接的回答指出,DbUnit的XML文件中包含的数据,而不是列类型。

而你真的不想这样做; 你的风险与污染测试工件数据库,开辟该产品代码一不小心就会依赖于测试过程中创建的表的可能性。

需要做这有力地说明你没有你的数据库的创建和维护过程中充分定义和脚本做。



Answer 2:

不可以,你将与表中的定义来执行SQL脚本。

正如我张贴在另一个线程中,XML不包含足够的数据来创建一个表。 我想你可以做一些可怕的喜欢解析值试图找出它包含但是这将是很脆什么样的价值观。 这不同于Hibernate的在注释类也包含了大量的信息数据库的外观。 在Java类型的字段有注释和部分零件。

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



Answer 3:

春季启动/春JDBC可以初始化用普通JDBC的数据库。

春天JDBC有一个DataSource初始化功能。 春天引导使得它在默认情况下并加载SQL从标准位置schema.sqldata.sql (在classpath的根目录)。 此外春季启动将加载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



Answer 4:

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

例如,对于休眠,指定属性hibernate.hbm2ddl.auto并将其值设置创造降(应该是罚款用于测试)。

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

但是,请确保JPA提供者是第一次访问DB)



Answer 5:

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

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

提醒一句的是,这个代码设置每个表的主键的第一列,所以要小心,如果你使用的关系表,因为你可以在进口获得“主键约束冲突”。 感谢您的代码片段!



文章来源: Is there any way for DBUnit to automatically create tables?