小编cdh*_*ker的帖子

为什么AndroidTestCase.getContext().getApplicationContext()返回null?

更新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)

junit android unit-testing android-context

21
推荐指数
1
解决办法
1万
查看次数

标签 统计

android ×1

android-context ×1

junit ×1

unit-testing ×1