2012-02-22 5 views
1

방금 ​​지난 2 일 동안 DBUnit을 사용하고 xml 파일과 테이블을 비교하는 데 문제가 있습니다.DBUnit : NoSuchTableException catch

나는 모든 코드를 붙여 넣었으며 일부 코드를 간소화하여 사람들이 문제를 찾아 낼 수 있도록했습니다.

실제로 추출을 수행하는 방법 (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 문을 추가하여 쿼리 매개 변수를 추가하십시오.