2012-10-20 33 views
1

我正在为我的Android应用程序编写JUnit测试。我已阅读了Android开发人员资源(测试基础,Spinner示例测试等)。现在我想独立于使用它的活动来测试我的SQLiteOpenHelper子类。我的想法是延长ActivityInstrumentationTestCase2<Activity>。简单地使用Activity作为泛型参数还是需要子类,可以吗?另外,我是否在这里朝着正确的方向前进,还是有更好的方法来测试我的SQLiteOpenHelper子类?使用JUnit测试SQLiteOpenHelper子类

+0

正常的'AndroidTestCase'应该足够了。出于测试目的,使用嘲讽由数据库帮助器创建的'SQLiteDatabase'的'ContextWrapper'可能是有用的(可以通过覆盖'Context#openOrCreateDatabase(String,int,CursorFactory)''来完成') – Jens

+0

@Jens感谢提示。我会检查出来的。 –

+0

@Jens你能否提供更多的细节作为答案?特别是,我不清楚重写'Context#openOrCreateDatabase()'。你的意思是创建一个模拟的'Context'子类,我传递给'ContextWrapper'? –

回答

3

我一直在寻找的答案,正是这个问题,并发现此链接,以及其他有趣的相关问题在这里:

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所做的评论上。

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

这允许您的测试代码将实际不同的数据库实例用于您的PRODUCTION代码 - 至少在我的情况下这将会很有用。


这是另一个有关的帖子里公认的答案说,几乎同样的事情:

在有关于使用ContentProvider而不是一些有用的技巧(但是这是一个不同的问题的另一天)。

+0

谢谢你回答我的老问题。这是我仍在努力的事情。自从问这个问题以来,我已经看到了你关联的问题,但我正在为ContentProvider寻找测试。感谢您将相同的技术返回到测试SQLiteOpenHelper。 –

+0

当然,我发现当我试图学习新的方法时,收集问题的不同方面是非常有用的。同时清理网站,将问题链接在一起。希望有些未来的读者会觉得这很有用。 –

+0

@RichardLeMesurier我实际上被困在我需要创建表的部分。因为当然你也必须在你的测试用例中触发表的创建。名称“MyDatabase”是一个骗局,因为新的MyDatabase(上下文)创建一个新的SQliteHelper,而不是相关的表 - 或者我错过了什么? – AgentKnopf

0

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

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

可能是你已经看到,它只是张贴在你已经错过了做的时候情况..这是一个很好的资源,以了解JUnit的android系统...

+0

谢谢。我可能应该在我的帖子中提到我已经阅读了Android测试资源。我正在查找特定于测试SQLiteOpenHelper的子类的信息。 –

0

对于与Android Studio的测试,

您应该使用MockContext而不是RenamingDelegatingContext

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

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