- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道这里有关于 dbunit 的讨论。我已经阅读了其中的大部分内容,但我似乎无法找到解决问题的方法。
我已经设置了hibernate和spring。我正在做 TDD,所以我必须在编写代码之前连接一个合适的 DAO 测试框架。我想到了 Dbunit,我开始设置它。这是 ma testdataset.xml
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<table name="status">
<column>statusId</column>
<column>status</column>
<row>
<value>0</value>
<value>Available</value>
</row>
</table>
<table name="user">
<column>userId</column>
<column>firstName</column>
<column>lastName</column>
<column>username</column>
<column>password</column>
<column>email</column>
<row>
<value>0</value>
<value>system</value>
<value>admin</value>
<value>admin</value>
<value>admin</value>
<value>admin@ccbs.com</value>
</row>
</table>
<table name="reservation">
<column>reservationId</column>
<column>userId</column>
<column>reservationDate</column>
<column>startDate</column>
<column>endDate</column>
<column>statusId</column>
<row>
<value>0</value>
<value>0</value>
<value>2011-02-20 12:46:00.0</value>
<value>2011-03-01 12:00:00.0</value>
<value>2011-04-01 12:00:00.0</value>
<value>0</value>
</row>
</table>
</dataset>
一切似乎都很好,直到我尝试使用加载数据集的基类连接一些代码。这是我的代码:
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-applicationContext.xml" })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class BaseContextSensitiveTest {
@BeforeClass
public static void setUpDatabase() throws Exception {
URL file = getInitalDatasetURL();
testDataset = createDataset(file);
}
@Before
public void init() throws Exception {
log.info("Initializing Data Set");
connection = createDBUnitConnection();
DatabaseOperation.CLEAN_INSERT.execute(connection, testDataset);
}
private static URL getInitalDatasetURL() throws FileNotFoundException {
URL file = ClassLoader.getSystemResource(TEST_DATASET_LOCATION);
if (file == null) {
throw new FileNotFoundException("Unable to find '"
+ TEST_DATASET_LOCATION + "' in the classpath");
}
return file;
}
private static IDataSet createDataset(URL file) throws IOException,
DataSetException {
return new XmlDataSet(file.openStream());
}
private IDatabaseConnection createDBUnitConnection()
throws DatabaseUnitException, SQLException {
Connection connection = getConnection();
IDatabaseConnection dbUnitConn = new DatabaseConnection(connection);
// use the hsql datatypefactory so that boolean properties work
// correctly
DatabaseConfig config = dbUnitConn.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new HsqldbDataTypeFactory());
return dbUnitConn;
}
一旦它命中 DatabaseOperation.CLEAN_INSERT.execute(connection, testDataset);
,它就会抛出以下异常:
org.dbunit.dataset.NoSuchTableException: Did not find table 'USER' in schema 'null'
at org.dbunit.database.DatabaseTableMetaData.<init>(DatabaseTableMetaData.java:142)
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:290)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at com.cottage.test.BaseContextSensitiveTest.init(BaseContextSensitiveTest.java:64)
我已经准备好了所有的 hibernate 映射文件,而且数据库已经设置好了,没有数据。有趣的事情(或者烦人的事情取决于你如何看待它)是如果我改变数据集中表的顺序,missingtableexception 会提示另一个表......用户,预订或状态。
对我可能做错了什么有什么建议吗?
最佳答案
我也遇到过同样的错误,上面接受的修复没有解决我的问题。但是我找到了解决方案。
我的设置包括 DBUnit(2.4)、作为我的 JPA 提供程序的 EclipseLink(2.1) 和作为我的后端数据库的 Postgres。此外,在我的场景中,我没有为每次测试运行删除和重新创建表。我的测试数据已经存在。我知道不好的做法,但它更像是一个测试/原型(prototype)制作场景。下面的代码说明了用于解决我的问题的 DBUnit 配置。
54 // ctx represents a spring context
55 DataSource ds = (DataSource)ctx.getBean("myDatasourceBean");
56 Connection conn = DataSourceUtils.getConnection(ds);
57 IDatabaseConnection dbUnitConn = new DatabaseConnection(conn, "public");
58 DatabaseConfig dbCfg = dbUnitConn.getConfig();
59 dbCfg.setFeature(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
60 IDataSet dataSet = new FlatXmlDataSet(ClassLoader.getSYstemResourceAsStream("mydbunitdata.xml"));
61 DatabaseOperation.REFRESH.execute(dbUnitConn, dataSet);
上面代码中的两件事解决了我的问题。首先,我需要定义 DBUnit 应该使用的模式。这是在上面的第 57 行完成的。设置新的DatabaseConnection时,如果schema("public")不为null,应该传入。
其次,我需要 DBUnit 对数据库表名区分大小写。在我的 DBUnit xml 文件(“mydbunitdata.xml”)中,表名都是小写的,就像它们在数据库中一样。但是,如果您不告诉 DBUnit 使用区分大小写的表名,它会查找 Postgres 不喜欢的大写表名。因此,我需要在 DBUnit 中设置区分大小写的功能,这是在第 59 行完成的。
关于java - org.dbunit.dataset.NoSuchTableException : Did not find table 'xxx' in schema 'null' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5066201/
我是一名优秀的程序员,十分优秀!