我正在为我的Android应用程序编写JUnit测试。我已阅读了Android开发人员资源(测试基础,Spinner示例测试等)。现在我想独立于使用它的活动来测试我的SQLiteOpenHelper子类。我的想法是延长ActivityInstrumentationTestCase2<Activity>
。简单地使用Activity
作为泛型参数还是需要子类,可以吗?另外,我是否在这里朝着正确的方向前进,还是有更好的方法来测试我的SQLiteOpenHelper子类?使用JUnit测试SQLiteOpenHelper子类
回答
我一直在寻找的答案,正是这个问题,并发现此链接,以及其他有趣的相关问题在这里:
的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 name
(see documentation online)。
这允许您的测试代码将实际不同的数据库实例用于您的PRODUCTION代码 - 至少在我的情况下这将会很有用。
这是另一个有关的帖子里公认的答案说,几乎同样的事情:
在有关于使用ContentProvider
而不是一些有用的技巧(但是这是一个不同的问题的另一天)。
谢谢你回答我的老问题。这是我仍在努力的事情。自从问这个问题以来,我已经看到了你关联的问题,但我正在为ContentProvider寻找测试。感谢您将相同的技术返回到测试SQLiteOpenHelper。 –
当然,我发现当我试图学习新的方法时,收集问题的不同方面是非常有用的。同时清理网站,将问题链接在一起。希望有些未来的读者会觉得这很有用。 –
@RichardLeMesurier我实际上被困在我需要创建表的部分。因为当然你也必须在你的测试用例中触发表的创建。名称“MyDatabase”是一个骗局,因为新的MyDatabase(上下文)创建一个新的SQliteHelper,而不是相关的表 - 或者我错过了什么? – AgentKnopf
以下链接谈谈测试中的android:
http://developer.android.com/tools/testing/testing_android.html
可能是你已经看到,它只是张贴在你已经错过了做的时候情况..这是一个很好的资源,以了解JUnit的android系统...
谢谢。我可能应该在我的帖子中提到我已经阅读了Android测试资源。我正在查找特定于测试SQLiteOpenHelper的子类的信息。 –
对于与Android Studio的测试,
您应该使用MockContext
而不是RenamingDelegatingContext
。
如果你使用RenamingDelegatingContext
,你会得到上下文为空。 对于AndroidTestCase,getContext()
将返回null。对于InstrumentationTestCase,getInstrumentation().getContext()
将返回null。
有关更多信息,请参阅此答案。 https://stackoverflow.com/a/29063736/1020456
- 1. Android的SQLiteOpenHelper测试类
- 2. 测试使用JUnit
- 3. 测试使用JUnit
- 4. Maven JUnit测试用例测试类NoClassDefFoundException
- 5. 通用JUnit测试类
- 6. Android类JUnit测试
- 7. 使用JUnit测试软件包的类
- 8. 从另一个JUnit测试类运行JUnit测试类
- 9. 测试SQLiteOpenHelper类时上下文null null
- 10. Android的jUnit测试java.lang.NoClassDefFoundError:android /数据库/ sqlite的/ SQLiteOpenHelper
- 11. 如何从罐子中运行JUnit测试,而JUnit的找不到测试类
- 12. 用jUnit测试
- 13. Junit测试调用Dao类的Business类
- 14. 使用JUnit测试ServiceLocator
- 15. 使用JUnit测试执行
- 16. 使用Junit测试线程
- 17. 测试AndroidAnnotation EBean使用JUnit
- 18. Paramterized测试使用JUnit
- 19. JUnit测试类故障
- 20. Java - Junit测试OOP类
- 21. 类运行JUnit测试
- 22. 实例化jUnit测试类
- 23. Junit:测试查询类
- 24. JUnit类的测试资源
- 25. 创建JUnit测试套装时不会出现JUnit测试类
- 26. 用JUnit测试GUI
- 27. Junit测试用例
- 28. 使用gradle定制JUnit测试检测
- 29. JUnit日期类测试用例
- 30. JUnit测试用例 - 无法看到类
正常的'AndroidTestCase'应该足够了。出于测试目的,使用嘲讽由数据库帮助器创建的'SQLiteDatabase'的'ContextWrapper'可能是有用的(可以通过覆盖'Context#openOrCreateDatabase(String,int,CursorFactory)''来完成') – Jens
@Jens感谢提示。我会检查出来的。 –
@Jens你能否提供更多的细节作为答案?特别是,我不清楚重写'Context#openOrCreateDatabase()'。你的意思是创建一个模拟的'Context'子类,我传递给'ContextWrapper'? –