我加入了一个项目,该项目包含大量带有SQL语句的文件,用于创建用于集成测试的数据库.
我想知道如何使用这些文件来创建用于单元测试的数据库(使用java和maven).
我可以为每个单元测试创建一个HSQL内存数据库,甚至可以使用spring jdbc嵌入式数据库功能,但是在测试设置中要执行的SQL语句太多,这是不可扩展的.
所以我想在maven测试阶段开始时创建一个临时数据库(加载SQL语句),让单元测试访问这个临时数据库并执行各种操作,然后在maven结束时删除临时数据库测试阶段.
我看过sql-maven-plugin,它允许我进行测试阶段执行,但我不确定如何配置一个可用于所有单元测试的临时数据库.没有服务器可以连接,并且内存数据库不能在多个单元测试中工作(我假设).
一个选项可能是使用唯一的临时文件,例如将JDBC驱动程序URL指定为jdbc:hsqldb:file:/ path/to/temporary/file,但我不确定如何在maven中生成唯一的临时文件.
有关如何做到这一点的任何建议,或者是否有更好的方法?
更新:我决定使用在target/db目录中创建的基于文件的数据库.我使用maven clean插件在运行测试之前删除target/db目录,并使用maven sql插件从脚本创建数据库.
我在单元测试中创建了一个H2数据库.该数据库使用以下属性:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:file:target/db/testdb"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我正在使用com.h2database.h2jar文件的1.3.166版本.
当我运行我的测试时,我看到在target/db目录中创建的数据库,并且testdb.h2.db存在一个文件.我的测试运行并从数据库加载数据.我可以打开target/db/testdb.h2.db文件并查看用于创建数据库的SQL语句.
但是,当我尝试将target/db/testsb.h2.db文件加载到数据库浏览工具(如DBVisualizer)时,我看不到任何表或数据.对于DBVisualizer,我指定H2(嵌入式)模式.
我也尝试了H2控制台,但show tables命令返回一个空的结果集.
我无法看到我做错了什么:数据库文件存在,测试正确运行,但我无法在数据库浏览器中打开此文件.
有什么建议?
我使用a ContentProvider来查询数据库并返回一个Cursor用于CursorLoader:
ItemsActivity:
public class ItemsActivity extends SherlockActivity implements LoaderCallbacks<Cursor> {
@Override
public void onCreate(Bundle savedInstance) {
....
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
...
}
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CursorLoader(getApplicationContext(), itemsListUri, ...);
}
...
}
Run Code Online (Sandbox Code Playgroud)
ItemsContentProvider:
public Cursor query(Uri uri, String[] projection, String selection, ...) {
SqliteQueryBuilder builder = new SqliteQueryBuilder();
builder.setTables(ItemsTable.NAME);
return builder.query(db, projection, selection, ...);
}
Run Code Online (Sandbox Code Playgroud)
活动有一个ListView,我使用CursorAdapter(通过更新LoaderCallbacks)来表示光标内的数据.
这工作正常,直到我需要查找大型数据集中的项目(例如,超过30,000行).观察日志我发现查找超出了内存限制,并且从结果游标中删除了一些行.
我的问题:在使用这样的游标时,处理非常大的数据集的最佳方法是什么?
我目前的解决方案是将SQLite查询ContentProvider拆分为具有偏移和限制的查询序列,然后使用MergeCursor …