我必须进行扩展到服务的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()" 中给出了空指针异常。 我该如何解决这个问题。
答案 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());
}
}