2015-04-28 2 views
0

Я получаю исключение NoSuchTableException, когда dbunit пытается прочитать данные из XML-файла. Первоначально я думал, что эта проблема связана с HSQLDB и, следовательно, переключается на базу данных H2, но проблема сохраняется. Я новичок в dbunit и не могу получить хорошую документацию по этому вопросу. Все учебники, найденные в Интернете, имеют действительно более старые версии dbunit, а не достаточно подробные описания.Не удалось прочитать набор данных из xml с использованием базы данных dbunit и h2

Не уверен, что здесь происходит. Может ли кто-нибудь направить меня к тому, что не так с этой программой?

Ошибка журнала

SEVERE: Table 'users' not found in tableMap=org.dbunit.dataset.OrderedTableNameMap[_tableNames=[], _tableMap={}, _caseSensitiveTableNames=false] 
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.493 sec <<< FAILURE! 
testGetUser(com.istore.dao.UserDaoTest) Time elapsed: 0.42 sec <<< ERROR! 
org.dbunit.dataset.NoSuchTableException: users 
    at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288) 
    at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109) 
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79) 
    at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190) 
    at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103) 

pom.xml

<dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
     <version>1.4.187</version> 
     <scope>runtime</scope> 
    </dependency> 

SRC/тест/ресурсы/users.xml

<?xml version="1.0" encoding="UTF-8"?> 
<dataset> 
    <users id="1" name="Nital"/> 
</dataset> 

AbstractUserDaoTest.java

public class AbstractUserDaoTest extends DataSourceBasedDBTestCase { 

    private static final String USERS_DATASET = "/users.xml"; 
    private static final UserDao dao = new UserDao(); 
    protected static Connection connection; 
    protected static HsqldbConnection dbunitConnection; 

    @Override 
    protected DataSource getDataSource() { 
     //create datasource 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("org.h2.Driver"); 
     dataSource.setUrl("jdbc:h2:mem:test"); 
     dataSource.setUsername("sa"); 
     dataSource.setPassword(""); 
     return dataSource; 
    } 

    @Override 
    protected IDataSet getDataSet() throws Exception { 
     String fileName = getClass().getResource(USERS_DATASET).getFile(); 
     System.out.println("fileName = " + fileName); 
     FlatXmlDataSet dataset = new FlatXmlDataSetBuilder().build(new FileInputStream(fileName)); 
     System.out.println("dataset = " + dataset); 
     String[] tableNames = dataset.getTableNames(); 
     for (String t : tableNames) { 
      System.out.println("t = " + t); 
     } 
     return dataset; 
    } 

    @AfterClass 
    public void closeDatabase() throws Exception { 
     if (connection != null) { 
      connection.close(); 
      connection = null; 
     } 
     if (dbunitConnection != null) { 
      dbunitConnection.close(); 
      dbunitConnection = null; 
     } 
    } 
} 

UserDaoTest.java

public class UserDaoTest extends AbstractUserDaoTest { 
    @Test 
    public void testGetUser() { 
     String a = "abc"; 
     assertNotNull(a); 
    } 
} 

UserDao.java

public class UserDao extends BaseDao { 

    private static final Logger LOG = Logger.getLogger(UserDao.class); 

    public UserDao() { 
    } 

    public UserDao(DataSource dataSource) throws SQLException { 
     super(dataSource); 
    } 

    public User getUser(String userCd) throws SQLException { 
     String sql = "select * from users a where a.user_cd='" + userCd + "' and a.active='Y'"; 
     System.out.println("sql = " + sql); 
     UserQueryExecutor executor = new UserQueryExecutor(dataSource.getConnection(), sql); 
     User user = executor.getUser(); 
     LOG.debug("user = " + user); 
     return user; 
    } 

    //used in dbunit tests 
    public boolean createTable() throws SQLException { 
     String sql = "CREATE TABLE users (" + 
        " id INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1)," + 
        " name VARCHAR(100) NOT NULL) "; 
     System.out.println("sql = " + sql); 
     System.out.println("cn = " + dataSource.getConnection()); 
     UserQueryExecutor queryExecutor = new UserQueryExecutor(dataSource.getConnection(), sql); 
     boolean success = queryExecutor.createTable(); 
     System.out.println("success = " + success); 
     return success; 
    } 

} 

BaseDao.java

public class BaseDao { 

    private static final Logger LOG = Logger.getLogger(BaseDao.class); 

    protected DataSource dataSource; 
    //using this field for dbunit tests, otherwise dataSource will be sufficient 
    protected Connection connection; 

    public BaseDao() { 
    } 

    public BaseDao(DataSource dataSource) throws SQLException { 
     this.dataSource = dataSource; 
    } 

    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    //used only for dbunit tests 
    public void setConnection(Connection connection) { 
     this.connection = connection; 
    } 

} 

UserQueryExecutor.java

public final class UserQueryExecutor extends BaseQueryExecutor { 

    private static final Logger LOG = Logger.getLogger(UserQueryExecutor.class); 

    public UserQueryExecutor(Connection cn, String sql) { 
     super(cn, sql); 
    } 

    public User getUser() { 
     Statement stmt = null; 
     ResultSet rs = null; 
     User user = null; 

     LOG.debug(sql); 

     try { 
      stmt = cn.createStatement(); 
      rs = stmt.executeQuery(sql); 
      while (rs != null && rs.next()) { 
       user = new DataPopulator().populateUser(rs); 
      } 
      LOG.debug("user = " + user); 
     } catch (SQLException ex) { 
      LOG.error("Exception whiile fetching data for a user.......", ex); 
     } finally { 
      DbUtils.closeQuietly(cn, stmt, rs); 
     } 
     return user; 
    } 

    public boolean createTable() { 
     Statement stmt = null; 
     ResultSet rs = null; 
     boolean tableCreated = false; 

     LOG.debug(sql); 

     try { 
      stmt = cn.createStatement(); 
      tableCreated = stmt.execute(sql); 
      LOG.debug("tableCreated = " + tableCreated); 
     } catch (SQLException ex) { 
      LOG.error("Exception whiile creating user table.......", ex); 
     } finally { 
      DbUtils.closeQuietly(cn, stmt, rs); 
     } 
     return tableCreated; 
    } 

} 

BaseQueryExecutor.java

public class BaseQueryExecutor { 

    protected Connection cn; 
    protected String sql; 

    public BaseQueryExecutor(Connection cn, String sql) { 
     this.cn = cn; 
     this.sql = sql; 
    } 

} 

ответ

0

DBUnit не создает таблицы базы данных автоматически из XML Dataset, поскольку он не имеет достаточной информации. Если я ошибаюсь, вы не вызываете метод createTable() вашего UserQueryExecutor в любом месте.

Итак, перед тестированием вы должны выполнить скрипт для создания схемы базы данных (как правило, вы можете сделать это в методе setUp). Более подробная информация в других вопросах ОН, таких как this

Надеюсь, это поможет.