更新2012年2月13日:接受了一个答案,解释说这种行为是一个错误,并指出它似乎已经比v 1.6更好地消失在模拟器上,这使得它对我们大多数人来说都不是问题.解决方法只是循环/休眠,直到getContext().getApplicationContext()返回非null.结束更新
按照android.app.Application的javadoc,我定义了一个单例(称为数据库)我所有的活动中访问了状态和持久性数据,并Database.getDatabase(上下文)通过Context.getApplicationContext获取应用程序上下文().当活动通过自己getDatabase(上下文)这个设置像宣传的那样,但是当我从AndroidTestCase的getApplicationContext(运行单元测试)经常呼叫返回null,虽然较长的测试中,更频繁地返回一个非空值.
以下代码在AndroidTestCase中重现null - 单例不是演示所必需的.
首先,要记录app-instantiation消息,在测试中的应用程序中我定义了MyApp并将其添加到清单中.
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.i("MYAPP", "this=" + this);
Log.i("MYAPP", "getAppCtx()=" + getApplicationContext());
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我定义了一个测试用例,用于报告AndroidTestCase.getContext()4次,由一些睡眠和一个getSharedPreferences()调用分开:
public class DatabaseTest extends AndroidTestCase {
public void test_exploreContext() {
exploreContexts("XPLORE1");
getContext().getSharedPreferences("foo", Context.MODE_PRIVATE);
exploreContexts("XPLORE2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
exploreContexts("XPLORE3");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
exploreContexts("XPLORE4");
}
public void exploreContexts(String …Run Code Online (Sandbox Code Playgroud)