我正在为我的 Android 应用程序编写 JUnit 测试。我已经阅读了 Android 开发人员资源(测试基础知识、Spinner 示例测试等)。现在我想独立于使用它的活动来测试我的 SQLiteOpenHelper 子类。我的想法是扩展ActivityInstrumentationTestCase2<Activity>
. 可以简单地Activity
用作泛型参数还是我需要一个子类?另外,我是否朝着正确的方向前进,还是有更好的方法来测试我的 SQLiteOpenHelper 子类?
3 回答
我正在寻找这个问题的答案,并在这里找到了这个链接以及另一个有趣的相关问题:
@Pietro接受的答案显示了一些简单的代码,使用 basic 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 name
(参见在线文档)。
这允许您的 TEST 代码使用与您的 PRODUCTION 代码不同的数据库实例 - 至少在我的情况下这将是有用的。
这是另一个相关的帖子,其中接受的答案说的几乎相同:
那里有一些关于使用的有用提示ContentProvider
(但这是另一天的不同问题)。
以下链接讨论了在 android 中的测试:
http://developer.android.com/tools/testing/testing_android.html
可能你已经看过它只是发布它,以防你错过了它。它是一个很好的资源来了解 android 中的 junit ......
对于使用 Android Studio 进行测试,
您应该使用MockContext
而不是RenamingDelegatingContext
.
如果你使用RenamingDelegatingContext
,你会得到上下文为空。对于 AndroidTestCase,getContext()
将返回 null。对于 InstrumentationTestCase,getInstrumentation().getContext()
将返回 null。
有关详细信息,请参阅此答案。https://stackoverflow.com/a/29063736/1020456