2012-02-22 60 views
1

私はDBUnitを過去2日間使用していましたが、xmlファイルとテーブルを比較する際に問題がありました。DBUnit:NoSuchTableExceptionがキャッチ

私はすべてのコードを貼り付け、いくつかのコードを単純化して、人々が問題の原因を調べることができるようにしました。

実際には、抽出を行う方法(DB2から)はうまく機能します。私は単純に抽出に非常に似ているメソッドを追加しましたが、その機能はテーブルをXMLファイルと比較することです。デバッグモードで、私はこの行に行くとき:ITable tableAComparer = dataSet.getTable(table.getSchema().concat(".").concat(table.getTableName()));、 私は理由を理解していないNoSuchTableExceptionを取得...

誰かはヒントを持っていますか?

ありがとうございました。私はQueryDataSetのオブジェクト(のdataSet)このようにテーブルを追加するために必要な、

まず:

+0

これに対して実行しているデータベースにはすでにテーブルが作成されていますか? [この回答](http://stackoverflow.com/a/5070949/274466)に記載されているように、DBUnitは自動的にテーブルを生成しません。 – ig0774

+0

はい、私は同じテーブルからデータを抽出することができました。私はその抽出物を同じ表と比較したいだけです。 –

答えて

1

public abstract class TestNonRegressionAbstract extends DBTestCase { 

private IDatabaseConnection dbConn; 
private Config    cfg; 
private ArrayList<Table> tablesToExtract = new ArrayList<Table>(); 
private String path = null; 

/** 
* Methode permettant de cleaner la bd avant le chargement 
* 
* @see org.dbunit.DatabaseTestCase#setUp() 
*/ 
protected void setUp() throws Exception { 
    path = new java.io.File("").getAbsolutePath().concat("/junit/"); 
} 

/** 
* 
* Méthode qui extrait les tables qui doivent être backupées avant les tests 
* 
* @throws Exception si une exception est lancée 
*/ 
protected void extractTables() throws Exception { 

    try { 
     for (Table table : tablesToExtract) { 
      dbConn = initDBUnitConnection(table.getSchema()); 
      QueryDataSet dataSet = new QueryDataSet(dbConn); 
      dataSet.addTable(table.getSchema().concat(".").concat(table.getTableName())); 
      FlatXmlDataSet.write(dataSet, new FileOutputStream(path + table.getNomFichier())); 
      dbConn.close(); 
      dbConn = null; 
     } 
    } finally { 
     if (dbConn != null) 
     dbConn.close(); 
     dbConn = null; 
    } 
} 

/** 
* Méthode qui compare une table de la bd avec un fichier xml contenant les valeurs de la table 
* avant l'exécution du test. 
* 
* @throws Exception l'exception. 
*/ 
protected void compareTables() throws Exception { 

    this.getTablesToExtract().add(new Table("PRM", "TCALENDRIER", "PRM_TCALENDRIER.XML")); 
    try { 
     for (Table table : tablesToExtract) { 
      DiffCollectingFailureHandler myHandler = new DiffCollectingFailureHandler(); 
      dbConn = initDBUnitConnection(table.getSchema()); 
      dbConn.getConfig().setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true); 

      QueryDataSet dataSet = new QueryDataSet(dbConn); 
      ITable tableAComparer = dataSet.getTable(table.getSchema().concat(".").concat(table.getTableName())); 

      ITable filteredTable = DefaultColumnFilter.excludedColumnsTable(tableAComparer, new String[]{"MAJPAR", "MAJTIMESTAMP"}); 
      IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(new File(path + table.getNomFichier())); 
      Assertion.assertEquals(expectedDataSet.getTable(table.getTableName()), filteredTable, myHandler); 

      @SuppressWarnings("unchecked") 
      List<Difference> diffList = myHandler.getDiffList(); 

      for (Difference difference : diffList) { 
       System.out.println("Différence trouvé :" + difference.getColumnName() 
         + " Actuel:" + difference.getActualTable() + " Attendu:" + difference.getExpectedValue()); 
      } 
      dbConn.close(); 
      dbConn = null; 
     } 
    } finally { 
     if (dbConn != null) 
      dbConn.close(); 
      dbConn = null; 
    } 
} 

/** 
* Méthode qui initialise la connection DBUnit 
* 
* @param cfg 
*   la configuration avec les param BD 
* @return La connection 
* @throws Exception 
*    si erreur 
*/ 
private IDatabaseConnection initDBUnitConnection(String schema) throws Exception { 
    if (dbConn == null) { 
     if (cfg == null) { 
      initConfig(); 
     } 
     String driver = cfg.getValue("CRP_DB_DRIVER"); 
     String dbName = cfg.getValue("CRP_DB_NAME"); 
     String dbUser = cfg.getValue("CRP_DB_USER"); 
     String dbPswd = cfg.getValue("CRP_DB_PASSWORD"); 
     Class.forName(driver); 
     Connection connDBDemande = DriverManager.getConnection(dbName, dbUser, dbPswd); 

     // Init DBUnit connection 
     //dbConn = new DatabaseConnection(connDBDemande); 
     dbConn = new DatabaseConnection(connDBDemande, schema); 
    } 
    return dbConn; 
} 

private void initConfig() throws Exception { 
    if (cfg == null) { 
     cfg = new Config("com/foo/bar/junit/nonregression/CRPTest.properties"); 
    } 
} 

/** 
* @see org.dbunit.DatabaseTestCase#getDataSet() 
*/ 
@Override 
protected IDataSet getDataSet() throws Exception { 
    IDataSet databaseDataSet = getDbConn().createDataSet(); 
    return databaseDataSet; 
} 

/** 
* 
* Méthode qui récupère la table 
* 
* @param table le nom de la table à récuperer 
* @return la table 
* @throws Exception si une exception survient 
*/ 
protected ITable getDataFromTable(String table) throws Exception { 

    ITable actualTable = getDataSet().getTable(table); 
    return actualTable; 
} 

/** 
* 
* Méthode qui retourne la bd via DBUnit 
* 
* @return la connection à la BD via DBUnit 
*/ 
public IDatabaseConnection getDbConn() { 
    return this.dbConn; 
} 


public void setDbConn(IDatabaseConnection aDbConn) { 
    this.dbConn = aDbConn; 
} 

public class Table { 

    public Table(String schema, String tableName, String nomFichier) { 
     this.schema = schema; 
     this.tableName = tableName; 
     this.nomFichier = nomFichier; 
    } 

    private String schema; 
    private String tableName; 
    private String nomFichier; 
    public String getSchema() { 
     return this.schema; 
    } 
    public void setSchema(String aSchema) { 
     this.schema = aSchema; 
    } 
    public String getTableName() { 
     return this.tableName; 
    } 
    public void setTableName(String aTableName) { 
     this.tableName = aTableName; 
    } 
    public String getNomFichier() { 
     return this.nomFichier; 
    } 
    public void setNomFichier(String aNomFichier) { 
     this.nomFichier = aNomFichier; 
    } 

} 

public ArrayList<Table> getTablesToExtract() { 
    return this.tablesToExtract; 
} 

public void setTablesToExtract(ArrayList<Table> aTablesToExtract) { 
    this.tablesToExtract = aTablesToExtract; 
} 

}は最後に私の問題への答えを見つけました。

dataSet.addTable(table.getSchema().concat(".").concat(table.getTableName()), table.getSelectStatement()); 

を入力し、SELECT文を追加してクエリパラメータを追加します。

関連する問題