从J Unit Test Case调用时,getApplicationContext()返回null

时间:2015-01-23 09:04:48

标签: android junit android-service

我必须进行扩展到服务的Android类的J单元测试。

我的源代码中有以下行: -

    public class AService extends Service{

        public AService () {
            super("AService");
        }
    ....
    ...
    @Override
        public void onStart(Intent intent, int startId) {
            Log.d(TAG, "onStart");
            LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(
                BroadCastReceiver_Object,
                new IntentFilter("any String"));
            super.onStart(intent, startId);
        }
...
...
}

我需要对上面的类进行J单元测试。我按如下方式编写了测试类: -

public class AServiceTest extends AndroidTestCase {

    AService AServiceobj;

    /*
     * (non-Javadoc)
     * 
     * @see junit.framework.TestCase#setUp()
     */
    protected void setUp() throws Exception {
        super.setUp();
        AServiceobj = new AService();
    }

    /*
     * (non-Javadoc)
     * 
     * @see junit.framework.TestCase#tearDown()
     */
    protected void tearDown() throws Exception {
        super.tearDown();
    }


    public void testonStart() {
        Intent intent = new Intent();
        int startId = 0;
        AServiceobj.onStart(intent, startId);
    }
}

但是上面的TC失败了,它在" getApplicationContext()" 中给出了空指针异常。 我该如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

对于测试服务,您可以扩展ServiceTestCase

然后,您可以在开始服务之前使用setApplication()或/和setContext()与模拟上下文一起使用。

有关详情http://developer.android.com/tools/testing/service_testing.html

,请参阅此文章

更新:我添加了一些简短的示例,了解如何使用ServiceTestCase。

MyService只是简单的服务,它从应用程序上下文中读取processName(因此应用程序上下文必须在那里。这只是为了确认该示例有效,否则会出现与NullPointerException相同的问题)。

public class MyService extends Service {
    public MyService() {
    }

    private String procName;

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

        Context ctx = getApplicationContext();

        procName = ctx.getApplicationInfo().processName;
    }

    public String getProcName(){
        return this.procName;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new LocalBinder();
    }

    public class LocalBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }
}

这是测试服务:

public class MyServiceTest extends ServiceTestCase<MyService> {

    public MyServiceTest() {
        super(MyService.class);
    }

    public void testProcName(){
        // here we take and use context from ServiceTestCase.getContext()
        Intent intent = new Intent(getContext(), MyService.class);
        startService(intent);

        assertNotNull(getService().getProcName());
    }
}