我正在编写我的第一个Android数据库后端,并且正在努力对数据库的创建进行单元测试。
目前,我遇到的问题是获取有效的Context对象,以传递给我的SQLiteOpenHelper实现。有没有办法在扩展TestCase的类中获取Context对象?我想到的解决方案是在TestCase的设置方法中实例化一个Activity,然后将该Activity的Context分配给我的测试方法可以访问的字段变量...但是似乎应该有一个更简单的方法。
Answers:
您可以尝试切换到AndroidTestCase。通过查看文档,似乎它应该能够为您提供有效的Context并传递给SQLiteOpenHelper。
编辑:请记住,您可能必须在Eclipse的“ Android测试项目”中进行测试设置,因为测试将尝试在模拟器(或真实设备)上执行。
您可以使用InstrumentationRegistry
方法来获取上下文:
InstrumentationRegistry.getTargetContext()
-提供Context
目标应用程序的应用程序。
InstrumentationRegistry.getContext()
-提供Context
此工具包的。
对于AndroidX,请使用InstrumentationRegistry.getInstrumentation().getTargetContext()
或InstrumentationRegistry.getInstrumentation().getContext()
。
根据AndroidTestCase:getContext()
我的经验,使用该方法只会提供存根上下文。为了进行测试,我在主应用程序中使用了一个空活动,并Context
通过该活动获取了。我还用ActivityInstrumentationTestCase2
该类扩展了测试套件类。似乎为我工作。
public class DatabaseTest extends ActivityInstrumentationTestCase2<EmptyActivity>
EmptyActivity activity;
Context mContext = null;
...
@Before
public void setUp() {
activity = getActivity();
mContext = activity;
}
... //tests to follow
}
其他人都在做什么?
您可以从MockContext派生并返回例如MockResources on getResources()
,有效的ContentResolver ongetContentResolver()
等等。这让您有些痛苦,但可以进行一些单元测试。
替代方法是运行例如Robolectric,它可以模拟整个Android OS。这些将用于系统测试:运行起来要慢得多。
首先在(androidTest)下创建测试类。
现在使用以下代码:
public class YourDBTest extends InstrumentationTestCase {
private DBContracts.DatabaseHelper db;
private RenamingDelegatingContext context;
@Override
public void setUp() throws Exception {
super.setUp();
context = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), "test_");
db = new DBContracts.DatabaseHelper(context);
}
@Override
public void tearDown() throws Exception {
db.close();
super.tearDown();
}
@Test
public void test1() throws Exception {
// here is your context
context = context;
}}
this.getContext()
,null
将返回。那是应该如何工作的?我期望将返回一个可以与SQLite一起使用的丰富Context