当前位置: 首页 > 面试题库 >

DBUnit有什么方法可以自动创建表?

郝昊东
2023-03-14
问题内容

我刚刚意识到DBUnit本身不会创建表(请参阅如何在不面对NoSuchTableException的情况下使用具有普通JDBC和HSQLDB的DBUnit进行测试?)。

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文件包含数据,但不包含列类型。

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

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



 类似资料:
  • 在创建命令如下所示的配置单元表之后,我调用hql=[],这将花费9个映射器,与HDFS中的文件数量相同。 但我想要的是把所有的部分-I在一个分裂中,这样,应该只有三个映射器。 我尝试从继承,以测试自定义的是否可以工作。 但是当我将它挂载到配置单元中时,它返回异常: 有人能给我点线索吗?多谢!

  • 材料设计非常强调“纸张”的隐喻。要做到这一点,阴影是必不可少的。由于材料设计是一种理念,而不是API(尽管它内置在L中),因此应该在任何地方(Windows窗体、HTML/CSS等)进行设计。如何在Android API 14到20中做到这一点? 请注意,对于圆形和其他非方形形状,预制PNG实际上并不实用。

  • 问题内容: 我们的客户希望在记录创建日期之前订购。在我看来,这似乎是一个系统变量,它是记录本身的某种元数据。 有没有一种方法可以告诉您何时创建了一条记录,而没有实际创建带有默认值GetDate()的datetime字段,并希望没有人修改它? 问题答案: 没有。 您需要为此提供一列。 想象一下,如果您需要为创建的每条记录保留一条记录,那么元数据将有多大!您是否还想将元数据保留在元数据上,以便知道元数

  • 问题内容: 我有一个使用XML和反射将 s 返回到另一个类的类。 通常,这些对象是外部对象的子字段,但有时我想即时生成它。我已经尝试过类似的方法,但无济于事。我相信这是因为Java不允许你访问进行反射的方法。 如果提供的方法失败,则失败。我可以通过制作方法来解决它,或者制作另一个类来派生它。 长话短说,我只是想知道是否存在一种通过反射访问方法的方法。 问题答案: 你可以使用反射调用私有方法。修改已

  • 问题内容: 我正在使用MS Access2003。我想在MS Access中的“查询”中运行大量插入SQL语句。有没有简单(或确实有任何方法)做到这一点? 问题答案: 是的,没有。 您不能: 但是你可以做 如果您还没有表中的数据,那对您有什么帮助?好吧,您可以制作一个由很多带有硬编码结果的Select联合组成的Select语句。 注意:我还必须包括某种形式的虚拟表(例如,onerow),以愚弄访问

  • 这看起来很奇怪,因为可以自动生成这些迁移(例如,像django一样),而且令人惊讶的是,V1的create-commands是自动生成的,但是如果我以后添加一个表,我必须手动键入命令。 那么,我是错过了它,还是我真的必须编写迁移?