Android SQLite在测试中嵌套了事务

时间:2017-08-15 18:52:08

标签: android sqlite junit transactions

在我们的应用程序中,我们有"镜像表" - 一对几乎相同的表,我们需要测试我们的应用程序的逻辑,以便处理以适当的方式在镜像表中写入。看来我们只能在数据库级别上测试它 - 我们想检查方法工作的结果是否正确地写在数据库中。我们认为我们可以在@BeforeClass方法中开始外部事务,在测试用例中创建和关闭的嵌套事务中执行一些更改,因此在每个测试用例中,我们将在数据库中加载相同的基本数据集并在测试完成一些操作之后我们只是回滚嵌套事务。当然,在@AfterClass方法中结束外部事务而不将其标记为干净,因此更改不会出现在应用程序的数据库中。

似乎无法实现,因为Android不能正确支持嵌套交易 - 请参阅this answer

也许有办法在不影响数据库的情况下测试此行为?或者嵌套事务有一些解决方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

Android database framework实现嵌套事务,但只能通过抑制任何内部事务的任何SQL语句,如果任何(外部或嵌套)事务不成功,则回滚最外层事务。

事务和保存点具有不同的语义。如果要回滚到保存点,实际上必须使用savepoint statements;在Android中,这需要在任何地方避免框架的Map等调用,并直接执行保存点SQL语句。换句话说,您必须确保测试的代码使用您自己的数据库框架。