有没有办法对DBUnit的自动创建表?
-
20-09-2019 - |
题
我刚刚意识到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";
}
解决方案
不是真的。当你链接的回答指出,DbUnit的XML文件中包含的数据,而不是列类型。
你真的不想这样做; 的你的风险与测试工件,开放该产品代码一不小心就会依赖于测试过程中创建的表可能污染你的数据库。 p>
需要做这有力地说明你没有你的数据库的创建和维护过程中充分定义和脚本。
其他提示
没有。你将不得不与表定义来执行SQL脚本。
正如我张贴在另一个线程中,XML不包含足够的数据来创建表。我想你可以做一些可怕的喜欢解析值试图找出它包含但是这将是很脆什么样的价值观。这不同于Hibernate的在注释类也包含了大量的信息数据库的外观。在Java类型的字段有注释和部分零件。
<强>弹簧引导/弹簧JDBC可以初始化与普通的JDBC的数据库。强>
弹簧JDBC具有一个DataSource初始化功能。春季启动系统能够 默认情况下它和负载SQL从标准位置
schema.sql
和data.sql
(在类路径的根目录)。另外春天开机时会 加载schema-${platform}.sql
和data-${platform}.sql
文件(如果 本),其中平台是spring.datasource.platform
的值, 例如您可以选择将其设置为数据库中的供应商名称 (HSQLDB,H2,Oracle,MySQL等时,PostgreSQL等)。
的https://文档。 spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
如果你正在使用JPA通常你可以配置你的JPA提供程序,以便它创建初始化/更新表。
E.g。为休眠,指定属性的 hibernate.hbm2ddl.auto 和其值设置为创建降(应为细用于测试)。
参见: Hibernate文档,章3配置
但是,确保该JPA提供商是第一访问DB)
我只是想插话说,这是对我来说非常有帮助。我需要连接到Oracle数据库,并将其导出到一个XML文件,然后导入它作为一个测试HSQL数据库,并与Hibernate访问它。我用这个代码
之前做来创建表DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);.
提醒一句的是,这个代码设置每个表的主键的第一列,所以要小心,如果你使用的关系表,因为你可以在进口获得“主键约束冲突”。感谢您的代码段!