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

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

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

你真的不想这样做; 您冒着使用测试工件污染数据库的风险,这可能会导致生产代码意外地依赖于测试过程创建的表。

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

不可以。您必须使用表定义执行SQL脚本。

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

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

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

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

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

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

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

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

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

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

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

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