java - Not able to read a dataset from xml using dbunit and h2 database -
i getting nosuchtableexception exception when dbunit tries read data xml file. thought issue related hsqldb , hence switched h2 database issue persists. new dbunit , cannot date documentation on this. tutorial found online older versions of dbunit , not descriptive enough.
not sure what's going on here. can please guide me what's wrong program ?
error log
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 @ org.dbunit.database.databasedataset.gettablemetadata(databasedataset.java:288) @ org.dbunit.operation.deletealloperation.execute(deletealloperation.java:109) @ org.dbunit.operation.compositeoperation.execute(compositeoperation.java:79) @ org.dbunit.abstractdatabasetester.executeoperation(abstractdatabasetester.java:190) @ 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/test/resources/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(); (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 = "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 * users a.user_cd='" + usercd + "' , 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 default identity(start 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 field dbunit tests, otherwise datasource sufficient protected connection connection; public basedao() { } public basedao(datasource datasource) throws sqlexception { this.datasource = datasource; } public void setdatasource(datasource datasource) { this.datasource = datasource; } //used 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 user.......", ex); } { 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); } { 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; } }
dbunit doesn't create database tables automatically xml dataset because hasn't enough information. unless i'm mistaken, don't call method createtable() of userqueryexecutor anywhere.
so, have execute script create database schema before testing (typically can in setup method). there more info in other questions this
hope helps.
Comments
Post a Comment