【问题标题】:Android SQLite nested transactions in tests测试中的 Android SQLite 嵌套事务
【发布时间】:2017-08-15 18:52:08
【问题描述】:

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

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

也许有办法在不影响数据库的情况下测试这种行为?还是有一些嵌套事务的解决方法?

谢谢!

【问题讨论】:

  • Android 的数据库框架支持嵌套就好了。您没有正确阅读其他答案。
  • 嵌套事务没有像我们预期的那样回滚。我已经测试过了。也许我错过了什么......
  • 当任何(外部或嵌套)事务不成功时,整个事务将回滚。这有什么问题?
  • 我们想回滚到保存点,我的意思是。并且Android的数据库框架不允许ROLLBACK TO操作,当我们尝试执行该操作时会抛出异常

标签: android sqlite junit transactions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多