org.dbunit.dataset.NoSuchTableException 错误数据库数据集 - Table 'trip' 未找到
org.dbunit.dataset.NoSuchTableException ERROR DatabaseDataSet - Table 'trip' not found
我一直在 bing/google (boogle) 搜索,发现了一些匹配项(主要是在 Whosebug 上),我尝试应用建议的解决方案,但没有成功。
我正在使用 Java 8 和 DBUnit 2.5.1 以及 mysql-connector-java 5.1.36 和 mysql(版本 14.14 Distrib 5.6.15 , 对于 Win64 (x86_64)).
我正在阅读之前由 DBUnit 创建的 XML 文件,该文件定义了多个 table,其中一个名为 "trip"。我的 mysql 实例有一个名为 "dbunit" 的空数据库,我的期望是我的代码将读取 XML 并使用 table 填充数据库 "dbunit" table 行包含 XML 文件中的数据。
这是我的数据文件的一个片段,它是由 dbunit 从 mysql 数据库 "pocketguide3rded"(基于 SQL 袖珍指南第 3 版)中创建的。
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<trip name="M-28" stop="1" parent_stop="3"/>
<trip name="M-28" stop="3"/>
<trip name="M-28" stop="8" parent_stop="1"/>
<trip name="M-28" stop="9" parent_stop="8"/>
<trip name="M-28" stop="10" parent_stop="9"/>
<trip name="M-28" stop="11" parent_stop="10"/>
<trip name="Munising" stop="1"/>
<trip name="Munising" stop="2" parent_stop="1"/>
<trip name="Munising" stop="3" parent_stop="4"/>
<trip name="Munising" stop="4" parent_stop="6"/>
<trip name="Munising" stop="5" parent_stop="3"/>
<trip name="Munising" stop="6" parent_stop="2"/>
<trip name="US-2" stop="11" parent_stop="12"/>
<trip name="US-2" stop="12" parent_stop="14"/>
<trip name="US-2" stop="13" parent_stop="11"/>
<trip name="US-2" stop="14"/>
</dataset>
这是我的代码。
public static void fullDatabaseImport(File file) throws ClassNotFoundException,
DatabaseUnitException,
IOException,
SQLException {
IDatabaseConnection connection = getConnection();
IDataSet dataSet = new FlatXmlDataSet(file, true);
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
//DatabaseOperation.INSERT.execute(connection, dataSet);
}
public static IDatabaseConnection getConnection() throws ClassNotFoundException,
DatabaseUnitException,
SQLException {
// database connection
Class driverClass = Class.forName(_driverClass);
Connection jdbcConnection = DriverManager.getConnection(_jdbcConnection, username, password);
IDatabaseConnection dbConn = new DatabaseConnection(jdbcConnection/*,"dbunit"*/);
dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler());
dbConn.getConfig().setProperty(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
return dbConn;
}
我在调用 CLEAN_INSERT.execute 时收到此异常。
这是我尝试 运行 junit 测试的结果。
JUnit 版本 4.11
.ERROR DatabaseDataSet - Table 'trip' 在 tableMap=org.dbunit.dataset.OrderedTableNameMap[_tableNames=[], _[=148 中找不到=]Map={}, _caseSensitiveTableNames=true]
E
时间:0.464
有 1 次失败:
1) test5_Test(com.heintze.demos.wikidot_com_demoimportexport.DemoDBUnit)
org.dbunit.dataset.NoSuchTableException: 旅行
在 org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288) 在 org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
在 org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
在 com.heintze.demos.wikidot_com_demoimportexport.DemoDBUnit.fullDatabaseImport(DemoDBUnit.java:265)
在 com.heintze.demos.wikidot_com_demoimportexport.DemoDBUnit.test5_Test(DemoDBUnit.java:249)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:483)
在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(框架Method.java:47)
在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
在 org.junit.runners.model.FrameworkMethod.invokeExplosively(框架 Method.java:44)
在 org.junit.internal.runners.statements.InvokeMethod.evaluate(调用 Method.java:17)
在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
在 org.junit.runners.ParentRunner.运行Children(ParentRunner.java:236)
在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
在 org.junit.runners.ParentRunner.运行(ParentRunner.java:309)
在 org.junit.runners.Suite.运行Child(Suite.java:127)
在 org.junit.runners.Suite.运行Child(Suite.java:26)
在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
在 org.junit.runners.ParentRunner.运行Children(ParentRunner.java:236)
在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
在 org.junit.runners.ParentRunner.运行(ParentRunner.java:309)
在 org.junit.runner.JUnitCore.run(JUnitCore.java:160)
在 org.junit.runner.JUnitCore.run(JUnitCore.java:138)
在 org.junit.runner.JUnitCore.run(JUnitCore.java:117)
在 org.junit.runner.JUnitCore.run 主要 (JUnitCore.java:96)
在 org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
在 org.junit.runner.JUnitCore.main(JUnitCore.java:40)
失败!!!
测试 运行:1,失败:1
/cygdrive/c/Users/siegfried/Documents/spring-tool-suite-workspaces/DBUnitDemo/wikidot-com-demoimportexport/src/test/java/com/heintze/demos/wikidot_com_demoimportexport
问题是 DBUnit 只是用数据填充 tables。它实际上并没有创建 tables。我通过像这样覆盖 getSetupOperation 来解决这个问题:
@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
dbConnection = DriverManager.getConnection("jdbc:hsqldb:mem:tests", "sa", "");
createTables();
return DatabaseOperation.REFRESH;
}
private void createTables() throws Exception {
PreparedStatement statement = dbConnection
.prepareStatement("CREATE TABLE digidauthsessions ( "
+ "id INTEGER IDENTITY NOT NULL PRIMARY KEY,"
+ "request_token VARCHAR(50) NOT NULL,"
+ "response_token VARCHAR(50) NOT NULL,"
+ "relatienr VARCHAR(50) NOT NULL,"
+ "digidnameid VARCHAR(1000) NOT NULL" + ")");
statement.execute();
statement.close();
}
在这里,在 getSetupOperation 中,我直接连接到我的 hsql 测试数据库。通过该连接,我可以调用实际创建 table 的 createTables 方法。这是在这个重写的方法中完成的,因为这样我可以确定 table 总是在
之前创建
我一直在 bing/google (boogle) 搜索,发现了一些匹配项(主要是在 Whosebug 上),我尝试应用建议的解决方案,但没有成功。
我正在使用 Java 8 和 DBUnit 2.5.1 以及 mysql-connector-java 5.1.36 和 mysql(版本 14.14 Distrib 5.6.15 , 对于 Win64 (x86_64)).
我正在阅读之前由 DBUnit 创建的 XML 文件,该文件定义了多个 table,其中一个名为 "trip"。我的 mysql 实例有一个名为 "dbunit" 的空数据库,我的期望是我的代码将读取 XML 并使用 table 填充数据库 "dbunit" table 行包含 XML 文件中的数据。
这是我的数据文件的一个片段,它是由 dbunit 从 mysql 数据库 "pocketguide3rded"(基于 SQL 袖珍指南第 3 版)中创建的。
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<trip name="M-28" stop="1" parent_stop="3"/>
<trip name="M-28" stop="3"/>
<trip name="M-28" stop="8" parent_stop="1"/>
<trip name="M-28" stop="9" parent_stop="8"/>
<trip name="M-28" stop="10" parent_stop="9"/>
<trip name="M-28" stop="11" parent_stop="10"/>
<trip name="Munising" stop="1"/>
<trip name="Munising" stop="2" parent_stop="1"/>
<trip name="Munising" stop="3" parent_stop="4"/>
<trip name="Munising" stop="4" parent_stop="6"/>
<trip name="Munising" stop="5" parent_stop="3"/>
<trip name="Munising" stop="6" parent_stop="2"/>
<trip name="US-2" stop="11" parent_stop="12"/>
<trip name="US-2" stop="12" parent_stop="14"/>
<trip name="US-2" stop="13" parent_stop="11"/>
<trip name="US-2" stop="14"/>
</dataset>
这是我的代码。
public static void fullDatabaseImport(File file) throws ClassNotFoundException,
DatabaseUnitException,
IOException,
SQLException {
IDatabaseConnection connection = getConnection();
IDataSet dataSet = new FlatXmlDataSet(file, true);
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
//DatabaseOperation.INSERT.execute(connection, dataSet);
}
public static IDatabaseConnection getConnection() throws ClassNotFoundException,
DatabaseUnitException,
SQLException {
// database connection
Class driverClass = Class.forName(_driverClass);
Connection jdbcConnection = DriverManager.getConnection(_jdbcConnection, username, password);
IDatabaseConnection dbConn = new DatabaseConnection(jdbcConnection/*,"dbunit"*/);
dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler());
dbConn.getConfig().setProperty(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
return dbConn;
}
我在调用 CLEAN_INSERT.execute 时收到此异常。
这是我尝试 运行 junit 测试的结果。
JUnit 版本 4.11
.ERROR DatabaseDataSet - Table 'trip' 在 tableMap=org.dbunit.dataset.OrderedTableNameMap[_tableNames=[], _[=148 中找不到=]Map={}, _caseSensitiveTableNames=true]
E
时间:0.464
有 1 次失败:
1) test5_Test(com.heintze.demos.wikidot_com_demoimportexport.DemoDBUnit)
org.dbunit.dataset.NoSuchTableException: 旅行 在 org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288) 在 org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109) 在 org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79) 在 com.heintze.demos.wikidot_com_demoimportexport.DemoDBUnit.fullDatabaseImport(DemoDBUnit.java:265) 在 com.heintze.demos.wikidot_com_demoimportexport.DemoDBUnit.test5_Test(DemoDBUnit.java:249) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:483) 在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(框架Method.java:47) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(框架 Method.java:44) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(调用 Method.java:17) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 在 org.junit.runners.ParentRunner.运行Children(ParentRunner.java:236) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 在 org.junit.runners.ParentRunner.运行(ParentRunner.java:309) 在 org.junit.runners.Suite.运行Child(Suite.java:127) 在 org.junit.runners.Suite.运行Child(Suite.java:26) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 在 org.junit.runners.ParentRunner.运行Children(ParentRunner.java:236) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 在 org.junit.runners.ParentRunner.运行(ParentRunner.java:309) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:160) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:138) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:117) 在 org.junit.runner.JUnitCore.run 主要 (JUnitCore.java:96) 在 org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47) 在 org.junit.runner.JUnitCore.main(JUnitCore.java:40)
失败!!! 测试 运行:1,失败:1
/cygdrive/c/Users/siegfried/Documents/spring-tool-suite-workspaces/DBUnitDemo/wikidot-com-demoimportexport/src/test/java/com/heintze/demos/wikidot_com_demoimportexport
问题是 DBUnit 只是用数据填充 tables。它实际上并没有创建 tables。我通过像这样覆盖 getSetupOperation 来解决这个问题:
@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
dbConnection = DriverManager.getConnection("jdbc:hsqldb:mem:tests", "sa", "");
createTables();
return DatabaseOperation.REFRESH;
}
private void createTables() throws Exception {
PreparedStatement statement = dbConnection
.prepareStatement("CREATE TABLE digidauthsessions ( "
+ "id INTEGER IDENTITY NOT NULL PRIMARY KEY,"
+ "request_token VARCHAR(50) NOT NULL,"
+ "response_token VARCHAR(50) NOT NULL,"
+ "relatienr VARCHAR(50) NOT NULL,"
+ "digidnameid VARCHAR(1000) NOT NULL" + ")");
statement.execute();
statement.close();
}
在这里,在 getSetupOperation 中,我直接连接到我的 hsql 测试数据库。通过该连接,我可以调用实际创建 table 的 createTables 方法。这是在这个重写的方法中完成的,因为这样我可以确定 table 总是在
之前创建