【问题标题】:Testing SQLiteOpenHelper subclass with JUnit使用 JUnit 测试 SQLiteOpenHelper 子类
【发布时间】:2012-10-20 18:35:12
【问题描述】:

我正在为我的 Android 应用程序编写 JUnit 测试。我已经阅读了 Android 开发人员资源(测试基础知识、Spinner 示例测试等)。现在我想独立于使用它的活动来测试我的 SQLiteOpenHelper 子类。我的想法是扩展ActivityInstrumentationTestCase2<Activity>。可以简单地使用Activity 作为通用参数还是我需要一个子类?另外,我的方向是否正确,还是有更好的方法来测试我的 SQLiteOpenHelper 子类?

【问题讨论】:

  • 普通的AndroidTestCase 就足够了。出于测试目的,使用模拟由数据库助手创建的SQLiteDatabaseContextWrapper 可能很有用(可以通过覆盖Context#openOrCreateDatabase(String, int, CursorFactory) 来完成)
  • @Jens 感谢您的提示。我去看看。
  • @Jens 您能否提供更多详细信息作为答案?特别是,我不清楚覆盖Context#openOrCreateDatabase()。你的意思是创建一个模拟Context 子类,我将其传递给ContextWrapper
  • 创建一个 ContextWrapper 的子类并覆盖 openOrCreateDatabase 应该适合你。
  • 子类化Context 意味着您必须通过SQLiteOpenHelper 追踪Context 中使用的所有方法 - 然后调用测试用例返回的包装Context -或为每一个返回合适的模拟值 - 即繁琐且毫无意义的忙碌工作。

标签: java android testing junit instrumentation


【解决方案1】:

我正在寻找这个问题的答案,并在这里找到了这个链接以及另一个有趣的相关问题:

accepted answer by @Pietro 显示了一些简单的代码,使用基本的AndroidTestCase,这将有助于直接回答问题。

public class DatabaseTest extends AndroidTestCase {
    private MyDatabase db;

    public void setUp(){
        RenamingDelegatingContext context 
        = new RenamingDelegatingContext(getContext(), "test_");
        db = new MyDatabase(context);
    }

    public void testAddEntry(){
        // Here I have my new database which is not connected to the standard database of the App
    }

    public void tearDown() throws Exception{
        db.close(); 
        super.tearDown();
    }
}

我很高兴它看起来如此简单。就我而言,我是 Android 测试的新手,所以现在即使是简单的东西似乎也很困难。


有趣的部分 是关键,它使用 RenamingDelegatingContext 类作为您的“上下文”,而不仅仅是使用普通上下文。这似乎建立在@Jens 制作的 cmets 之上。

此类包装给定上下文并将大多数操作委托给该上下文。有用的部分是它performs database and file operations with a renamed database/file name (see documentation online)。

这允许您的 TEST 代码使用与 PRODUCTION 代码实际不同的数据库实例 - 至少在我的情况下这是有用的。


这是另一个相关的帖子,其中接受的答案说的几乎相同:

那里有一些关于使用 ContentProvider 的有用提示(但这是另一天的不同问题)。

【讨论】:

  • 感谢您回答我的老问题。这是我仍在努力解决的问题。自从提出这个问题以来,我已经看到了您链接的问题,但我正在寻找 ContentProvider 的测试。感谢您将相同的技术与测试 SQLiteOpenHelper 相关联。
  • 当然,我发现当我尝试学习处理某事的新方法时,将问题的不同方面汇总在一起非常有帮助。还清理了网站以将问题链接在一起。希望一些未来的读者会发现这很有用。
  • @RichardLeMesurier 我实际上被困在需要创建表格的部分。因为您肯定也必须在您的测试用例中触发表创建?名称“MyDatabase”有点欺骗性,因为 new MyDatabase(context) 创建了一个新的 SQliteHelper,而不是关联的表 - 还是我遗漏了什么?
【解决方案2】:

以下链接谈论在 android 中的测试:

http://developer.android.com/tools/testing/testing_android.html

也许你已经看过它了

【讨论】:

  • 谢谢。我可能应该在我的帖子中提到我已经阅读了 Android 测试资源。我正在寻找特定于测试 SQLiteOpenHelper 子类的信息。
【解决方案3】:

对于使用 Android Studio 进行测试,

您应该使用MockContext 而不是RenamingDelegatingContext

如果你使用RenamingDelegatingContext,你会得到上下文为空。 对于 AndroidTestCase,getContext() 将返回 null。而对于 InstrumentationTestCase,getInstrumentation().getContext() 将返回 null。

有关详细信息,请参阅此答案。 https://stackoverflow.com/a/29063736/1020456

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多